Unity移动端虚拟摇杆开发:从UGUI事件到角色移动的完整实现
1. 项目概述为什么移动端摇杆是“手感”的基石做移动端游戏开发尤其是动作、RPG或者射击类游戏一个顺滑、跟手的虚拟摇杆绝对是玩家体验的“命门”。我见过太多因为摇杆手感稀烂导致明明玩法不错却差评如潮的案例。玩家不会去深究你的渲染管线多先进、AI逻辑多复杂他们上手的第一秒手指在屏幕上划拉的那一下就直接决定了游戏是“能玩”还是“好玩”。这个项目标题点得很准——在Unity2022环境下实现一个手机游戏操控摇杆或者说操控轮盘。这听起来像是个基础功能但里面的门道可不少。它绝不仅仅是屏幕上放个圆圈图片那么简单。一个合格的摇杆需要处理触摸输入、限制摇杆移动范围、将二维坐标转换为方向向量、还要考虑UI事件穿透、不同屏幕分辨率适配、以及最重要的提供可配置的“手感”比如死区、弹性、平滑度等。如果你是刚接触Unity的移动端开发或者你正在为你的项目寻找一个稳定、可复用的摇杆解决方案那么跟着我把这个轮子造一遍绝对比你从Asset Store下一个黑盒插件要强得多。你会彻底理解从触摸事件到角色移动的完整数据链路未来调试手感、做自定义扩展比如八方向锁定、压力感应都能得心应手。2. 核心设计思路从触摸点到方向向量的旅程实现一个虚拟摇杆核心思路可以概括为一条清晰的数据流捕获触摸 - 计算相对位移 - 约束于摇杆范围 - 输出标准化方向向量。但为了让这个摇杆好用我们需要在这条主线上加入多个“调节阀”。2.1 架构选型UGUI还是Raw Image在Unity里做UI首选UGUI。对于摇杆我们通常需要两个部分一个固定的背景图表示摇杆的活动区域和一个可移动的手柄图玩家实际拖动的部分。为什么用UGUI的Image组件事件系统集成好UGUI自带一套完善的事件系统EventTrigger,IPointerXHandler接口处理触摸PointerDown、拖动Drag、抬起PointerUp非常方便。RectTransform的强大RectTransform组件让我们能轻松地以锚点Anchors和轴心Pivot方式控制UI的位置和缩放这对于适配不同屏幕分辨率至关重要。我们可以轻松地将摇杆背景固定在屏幕左下角并确保其在各种屏幕上比例一致。渲染顺序管理方便作为Canvas下的元素渲染顺序由Hierarchy或Sorting Layer控制不易出错。有些教程会用SpriteRenderer配合Orthographic相机来做但这需要自己处理屏幕坐标转换和触摸碰撞检测在UI交互复杂的项目中容易与其它UI事件冲突。UGUI方案是更主流、更稳妥的选择。2.2 输入处理EventTrigger与自定义脚本的权衡处理输入你有两个主要选择为手柄Image添加EventTrigger组件然后为其Drag、PointerDown、PointerUp事件挂接自定义函数。编写一个完整的C#脚本实现IDragHandler,IPointerDownHandler,IPointerUpHandler接口。我强烈推荐第二种方案。使用接口的方式代码更清晰、性能稍好避免了EventTrigger内部的开销并且类型安全。我们的摇杆核心脚本将是一个继承了MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler的类。2.3 数据输出如何告知世界“我在朝哪边动”摇杆计算出的方向数据最终需要驱动游戏角色或摄像机。这里涉及一个关键的设计模式解耦。摇杆脚本不应该直接去修改PlayerController的Transform。好的做法是定义委托Delegate或事件Event摇杆脚本在方向更新时触发一个事件。使用UnityEvent在Inspector面板上可视化地拖拽连接目标对象和方法对设计师友好。提供公共属性比如public Vector2 Direction { get; private set; }让其他脚本可以随时读取当前方向。我会采用“UnityEvent 公共属性”的组合。UnityEvent用于在Inspector里快速配置简单的响应比如测试时直接驱动一个物体的移动而公共属性供其他复杂脚本如角色状态机以编程方式获取数据这样灵活性最高。3. 核心组件实现与参数解析接下来我们进入实战环节一步步构建Joystick组件。我会先给出核心代码框架然后逐一解释每个参数和步骤的用意。3.1 组件结构与初始化首先创建一个C#脚本命名为MobileJoystick.cs。using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class MobileJoystick : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler { [Header(UI References)] [SerializeField] private RectTransform background; // 摇杆背景 [SerializeField] private RectTransform handle; // 摇杆手柄 [Header(Settings)] [SerializeField] private float handleRange 1f; // 手柄移动最大半径相对于背景半径的比例 [SerializeField] private float deadZone 0.2f; // 死区大小0-1的比例值 [Header(Output)] public UnityEventVector2 OnValueChanged; // 方向变化事件 public Vector2 Direction { get; private set; } // 当前标准化方向 private Vector2 inputVector Vector2.zero; // 原始输入向量未标准化 private Canvas parentCanvas; private Camera eventCamera; private void Start() { // 确保手柄初始位置在背景中心 if (handle ! null) handle.anchoredPosition Vector2.zero; // 获取父级Canvas用于坐标转换 parentCanvas GetComponentInParentCanvas(); // 获取该Canvas使用的渲染相机对于Screen Space - Camera或World Space模式很重要 eventCamera parentCanvas?.renderMode RenderMode.ScreenSpaceOverlay ? null : parentCanvas?.worldCamera; } }参数解析backgroundhandle这就是我们拖拽进来的UI图片。注意类型是RectTransform因为我们需要直接操作其 anchoredPosition。handleRange这个值决定了手柄能从背景中心移动多远。设为1通常意味着手柄可以移动到背景的边缘。如果你想做一个“小背景、大手柄”的摇杆可以将其设置为大于1的值如1.5让手柄能超出背景范围这在某些视觉风格下很常见。deadZone这是影响“手感”最重要的参数之一。死区指的是靠近中心的一个圆形区域在这个区域内摇杆的输出方向会被强制归零。为什么需要它因为玩家的手指不可能绝对静止微小的抖动会产生噪声输入。如果没有死区角色可能会不受控制地微微晃动体验极差。通常设置在0.1到0.3之间。OnValueChanged这是一个UnityEventVector2它允许我们在Inspector中动态绑定方法。当摇杆方向变化时它会传递一个Vector2参数即标准化后的方向。inputVector存储从触摸点到背景中心的原始偏移向量范围在[-handleRange, handleRange]之间。注意在Start中初始化手柄位置至关重要。如果不做手柄可能会停留在上次编辑时的位置导致游戏运行时摇杆初始状态不正确。3.2 触摸与拖动逻辑的实现现在实现三个核心接口方法。public void OnPointerDown(PointerEventData eventData) { // 当手指按下时立即触发一次拖动让手柄跳到按下的位置 OnDrag(eventData); } public void OnDrag(PointerEventData eventData) { // 1. 将屏幕触摸点转换为背景RectTransform本地空间内的坐标 RectTransformUtility.ScreenPointToLocalPointInRectangle( background, eventData.position, eventCamera, out Vector2 localPoint ); // 2. 计算相对于背景中心的位置向量 // background.rect.size 获取的是背景的宽高以像素为单位。 // 我们将localPoint除以背景尺寸的一半将其归一化到一个基于背景尺寸的坐标系中。 // 这样当触摸点在背景边缘时向量的长度大约为1或handleRange。 Vector2 sizeDelta background.rect.size; inputVector (localPoint / (sizeDelta * 0.5f)).normalized * handleRange; // 3. 限制手柄移动范围 ClampHandlePosition(); // 4. 更新手柄的视觉位置 handle.anchoredPosition inputVector * (sizeDelta.magnitude * 0.5f); // 5. 处理死区并计算最终输出方向 CalculateOutputDirection(); } public void OnPointerUp(PointerEventData eventData) { // 手指抬起重置所有状态 inputVector Vector2.zero; handle.anchoredPosition Vector2.zero; Direction Vector2.zero; // 触发事件通知方向已归零 OnValueChanged?.Invoke(Direction); }关键步骤解读坐标转换 (ScreenPointToLocalPointInRectangle)这是最易出错的一步。eventData.position是屏幕坐标像素我们需要将其转换到背景RectTransform的本地坐标系中。localPoint的(0,0)点就是背景矩形的轴心点Pivot通常设为(0.5,0.5)即中心。第三个参数eventCamera对于Screen Space - Overlay模式的Canvas传null其他模式传对应的渲染相机这里我们用Start中获取的逻辑自动处理。归一化与范围控制localPoint / (sizeDelta * 0.5f)这一步是关键。假设背景是200x200像素那么sizeDelta * 0.5f就是(100, 100)。如果触摸点正好在背景右边缘localPoint可能是(100, 0)除以后得到(1, 0)其长度正好是1。再乘以handleRange就得到了在设定范围内的输入向量。这里先normalized再乘是为了确保向量方向准确长度受handleRange控制。ClampHandlePosition方法这是一个辅助方法用于确保inputVector的长度不超过handleRange。虽然上面的计算理论上控制了长度但为了防止意外最好再加一道保险。private void ClampHandlePosition() { if (inputVector.magnitude handleRange) { inputVector inputVector.normalized * handleRange; } }3.3 方向计算与死区处理CalculateOutputDirection方法是摇杆逻辑的“大脑”它负责将原始输入转化为可用的方向指令。private void CalculateOutputDirection() { // 1. 计算原始输入向量的长度比例值最大为handleRange float magnitude inputVector.magnitude / handleRange; // 2. 应用死区 if (magnitude deadZone) { // 输入在死区内输出为零向量 Direction Vector2.zero; } else { // 3. 重新映射死区外的值到[0,1]区间使输出更线性 // 公式(当前值 - 死区值) / (1 - 死区值) float normalizedMagnitude (magnitude - deadZone) / (1 - deadZone); // 确保值在[0,1]之间 normalizedMagnitude Mathf.Clamp01(normalizedMagnitude); // 4. 计算最终方向保持原始输入的方向应用重新映射后的长度 Direction inputVector.normalized * normalizedMagnitude; } // 5. 触发方向变化事件 OnValueChanged?.Invoke(Direction); }死区与重新映射详解这是提升手感的核心算法。假设deadZone 0.2。当手指移动距离比例小于20%时Direction为(0,0)角色不动。当手指移动距离达到40%时原始magnitude0.4。应用公式(0.4 - 0.2) / (1 - 0.2) 0.2 / 0.8 0.25。最终Direction向量的长度是0.25方向与输入相同。这样做的效果是手指刚离开死区时输出是平缓起步的而不是从0突然跳到0.2操作感更细腻、线性。很多手感差的摇杆就是少了这一步重新映射导致移动生硬。4. 场景搭建与高级功能拓展代码写好了怎么用起来我们从头搭建一个场景。4.1 UI搭建步骤在Canvas下创建一个空GameObject重命名为“Joystick”挂载我们的MobileJoystick脚本。在“Joystick”下创建一个Image作为background比如一个灰色的圆环。将其锚点Anchor预设为左下角Bottom-Left并调整位置和大小。在background下再创建一个Image作为handle比如一个亮色的实心圆。将其锚点Anchor设置为居中Middle-Center这样它的轴心就在中心。在Inspector中将background和handle的RectTransform分别拖拽到MobileJoystick脚本的对应字段。关键一步确保handle的父级是background并且background的RectTransform组件上不要勾选“Raycast Target”。因为我们需要的是在“Joystick”空物体或者handle上接收事件如果背景也接收射线可能会干扰其他UI。4.2 连接角色移动创建一个简单的角色控制器脚本PlayerMovement.cs来测试。using UnityEngine; public class PlayerMovement : MonoBehaviour { public float moveSpeed 5f; private MobileJoystick joystick; private Rigidbody2D rb; // 如果是2D游戏 // private CharacterController controller; // 如果是3D游戏 private void Start() { // 假设摇杆在场景中只有一个或者通过标签/引用赋值 joystick FindObjectOfTypeMobileJoystick(); rb GetComponentRigidbody2D(); } private void Update() { if (joystick ! null) { Vector2 direction joystick.Direction; // 方式一直接使用属性每帧读取 Vector3 movement new Vector3(direction.x, 0, direction.y) * moveSpeed * Time.deltaTime; // 简单Transform移动适用于原型 // transform.Translate(movement); // 方式二使用Rigidbody进行物理移动更佳 if (rb ! null) { rb.velocity direction * moveSpeed; } } } }更优雅的方式是使用摇杆的OnValueChanged事件来驱动移动这样可以避免每帧Update中的查询减少不必要的计算。你可以在Inspector里将PlayerMovement的一个公共方法如public void OnMoveInput(Vector2 dir)拖到摇杆的OnValueChanged事件上。4.3 高级功能拓展思路一个基础摇杆完成后可以根据游戏需求添加更多功能动态摇杆Dynamic Joystick手指在屏幕任意位置按下时摇杆背景才在那个位置出现并开始工作。这需要修改OnPointerDown动态设置background的位置为屏幕触摸点并将其设置为激活状态。固定方向4向/8向锁定在CalculateOutputDirection中计算完Direction后可以将其角度Mathf.Atan2(Direction.y, Direction.x)进行“取整”到最近的45度或90度角再转换回向量。这常用于复古风格游戏。摇杆事件穿透如果你的摇杆区域覆盖了其他需要点击的UI比如技能按钮你需要处理事件穿透。可以在MobileJoystick脚本中实现IPointerClickHandler接口但在OnPointerClick方法中不进行任何操作并确保EventSystem的点击检测逻辑正确。更常见的做法是合理布局UI避免重叠。手感参数扩展平滑Smoothing不对Direction进行立即赋值而是使用Vector2.SmoothDamp进行平滑插值可以消除输入的突变让角色转向更柔和。弹性Elasticity在OnPointerUp中不让手柄瞬间归位而是用Vector2.Lerp或DOTween等工具让其动画化地弹回中心增强视觉反馈。5. 常见问题、调试技巧与性能优化在实际集成过程中你肯定会遇到一些坑。这里把我踩过的和常见的问题列出来。5.1 摇杆无反应或手柄不动排查清单射线检测Raycast Target这是头号杀手。确保handle的Image组件上Raycast Target是勾选的这样它才能接收事件而background的Image组件上不要勾选除非你需要背景也接收事件。我们的脚本通常是挂在父物体或handle上。Canvas渲染模式与相机如果你的Canvas是Screen Space - Camera或World Space务必在脚本初始化时正确获取并传入eventCamera。ScreenPointToLocalPointInRectangle函数需要正确的相机参数才能进行坐标转换。RectTransform锚点与轴心检查background和handle的锚点Anchors和轴心Pivot。background的轴心通常应为(0.5,0.5)handle的轴心也必须为(0.5,0.5)以确保围绕中心旋转/移动。background的锚点决定了它相对于屏幕或父物体的位置。脚本引用丢失在Inspector中检查MobileJoystick脚本的background和handle字段是否成功拖拽赋值。5.2 手柄移动范围不正确或偏移handleRange值过小检查handleRange值如果设为0.5那手柄只能移动背景半径的一半。通常从1开始调试。坐标转换基准错误ScreenPointToLocalPointInRectangle的第一个参数必须是background的RectTransform。如果你错误地传入了handle或者父物体计算出的localPoint坐标系就全乱了。背景尺寸获取问题在OnDrag中我们使用background.rect.size。请确保在Awake或Start之后调用并且background引用不为空。有时在编辑器模式下未正确初始化可能导致size为0。5.3 在复杂UI中事件冲突当屏幕上存在多个可交互UI时如摇杆多个按钮EventSystem需要决定哪个对象响应触摸。这由GraphicRaycaster和物体的层级顺序决定。确保摇杆区域在需要优先响应的按钮之上可以通过调整Canvas下子物体的顺序越靠下渲染顺序越晚但事件检测可能更优先取决于具体设置或使用不同的Canvas和Sorting Layer来管理。使用EventSystem.current.IsPointerOverGameObject在其他脚本如控制摄像机旋转的脚本中可以先判断当前触摸是否在UI上如果是则忽略该触摸避免UI操作与游戏操作冲突。5.4 性能与多平台适配避免每帧查找FindObjectOfType像上面测试代码那样用FindObjectOfType获取摇杆引用在正式项目中是性能隐患。应该使用单例模式、依赖注入通过Inspector赋值或消息系统来获取引用。Input.touches vs EventSystem我们的实现基于UGUI事件系统这适用于大多数情况。如果你需要处理更底层的多点触控例如同时处理摇杆和双指缩放可能需要同时监听Input.touches。这时要注意事件处理的优先级避免重复响应。不同屏幕比例适配我们的摇杆使用锚点定位因此能很好地适应不同屏幕。但要测试极端屏幕比例如超宽屏或iPad的4:3确保摇杆背景没有因为锚点设置而被过度拉伸或压缩。可以考虑为background和handle设置Aspect Ratio Fitter组件来保持圆形。最后关于“手感”的调优没有绝对标准它服务于你的游戏类型。一个快节奏的射击游戏可能需要更小的死区如0.05和更快的响应而一个注重探索的RPG可能需要更大的死区如0.25和加入平滑过滤让移动更稳重。最好的方法是在真机上反复测试收集玩家的反馈用数据如输入曲线图来辅助决策。把这个最基础的交互做到极致你的游戏就成功了一半。

相关新闻

Qt触屏事件开发实战:从多点触控到手势识别

Qt触屏事件开发实战:从多点触控到手势识别

1. 从鼠标到指尖:为什么Qt触屏事件值得你花时间如果你和我一样,从传统的桌面应用开发转向移动或触摸屏设备开发,那么“Qt中的触屏事件”这个话题,绝对是你绕不开的一道坎。它不像按钮点击那样直观,也不像键盘事件那样有…

2026/10/12 4:22:02 阅读更多 →
FreeRTOS核心机制与面试高频问题深度解析

FreeRTOS核心机制与面试高频问题深度解析

1. 项目概述与核心价值最近在帮团队筛选嵌入式软件工程师,也和一些准备跳槽的朋友聊了聊,发现一个挺普遍的现象:很多人简历上项目经验写得天花乱坠,STM32、ESP32玩得飞起,但一聊到操作系统,特别是FreeRTOS&…

2026/10/10 20:12:16 阅读更多 →
Qt触屏事件深度解析:从QTouchEvent到多点触控绘图板实战

Qt触屏事件深度解析:从QTouchEvent到多点触控绘图板实战

1. 项目概述:为什么Qt触屏事件值得深挖?在移动设备和触摸屏一体机越来越普及的今天,为桌面应用添加触屏支持已经从一个“加分项”变成了很多场景下的“必需品”。作为一名有十多年经验的Qt开发者,我见过太多项目在初期只考虑键鼠操…

2026/10/4 21:28:51 阅读更多 →

最新新闻

Logstash离线插件安装实战:依赖解析、打包与验证全流程

Logstash离线插件安装实战:依赖解析、打包与验证全流程

1. 为什么Logstash插件必须离线安装——一个被低估的生产环境现实Logstash作为ELK栈中承上启下的数据管道核心,其价值从来不在“能跑起来”,而在于“能在哪跑、怎么稳跑、出问题时能否快速恢复”。我见过太多团队在测试环境用bin/logstash-plugin instal…

2026/10/13 14:01:51 阅读更多 →
百度人工智能试题备考:从机器学习基础到工程化落地

百度人工智能试题备考:从机器学习基础到工程化落地

简介:面向百度人工智能岗位的经典考试试题合集,覆盖语义网络、推理、知识表示、机器学习与自然语言处理等核心模块,适合正在准备人工智能面试或系统复习基础知识的学习者。资源包仅含1个doc文档,压缩包大小279KB,文件虽…

2026/10/13 14:01:51 阅读更多 →
知识工作者的插件矩阵:从信息摄入到检索复用的搭建实录

知识工作者的插件矩阵:从信息摄入到检索复用的搭建实录

从"装插件"到"搭系统":知识工作者的插件矩阵搭建实录最近常常被问到一个很朴素的问题:那些每天都在产出内容、处理信息的知识工作者,桌面上的浏览器和编辑器到底装着哪些插件?说句实话,两年前我自…

2026/10/13 14:01:51 阅读更多 →
软件交付移交清单:27项可验证条目与自动化校验实践

软件交付移交清单:27项可验证条目与自动化校验实践

简介:本资源是一份开箱即用的软件交付系统移交清单标准化模板,面向项目经理、实施工程师及IT交付团队,解决项目收尾阶段交付物遗漏、文档不全、软硬件与培训材料脱节等常见痛点。模板覆盖项目基本信息、软件/硬件/文档/其他四类交付清单&…

2026/10/13 14:01:51 阅读更多 →
Delphi 集成 Chromium:CEF4Delphi 控件从入门到请求拦截实战

Delphi 集成 Chromium:CEF4Delphi 控件从入门到请求拦截实战

简介:CEF4Delphi控件是一套面向Delphi开发者的Chromium谷歌内核浏览器集成方案,适合需要在桌面应用中嵌入现代网页渲染能力的开发者,覆盖从Delphi 7到Delphi 10.2的多个版本,作者已亲自测试调试安装正常。资源包共462个文件&#…

2026/10/13 14:01:51 阅读更多 →
Python字典的__missing__魔术方法:缺失键的优雅处理机制

Python字典的__missing__魔术方法:缺失键的优雅处理机制

就像所有键都找不到时会手足无措的字典一样,Python里的dict其实留了一扇专门处理这种情况的门,这门就是魔术方法__missing__。它是字典变体类的核心钩子:当d[key]访问的键不在字典里时,解释器不会直接抛KeyError,而是先…

2026/10/13 14:00:49 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →