Unity 3D:如何通过鼠标滚轮控制相机沿固定路径移动?
实现鼠标滚轮控制Cinemachine相机沿航点移动
核心思路
用Cinemachine的CinemachineDollyCart绑定预设路径,监听鼠标滚轮输入,每次滚动切换到下一个/上一个航点,通过控制Cart的位置值实现相机移动。
步骤实现
1. 先搭好场景
- 在Unity中创建
CinemachinePath,添加多个路径点(航点),摆好相机要走的路线 - 新建空物体作为相机容器,挂载
CinemachineVirtualCamera和CinemachineDollyCart组件 - 将
CinemachinePath拖入CinemachineDollyCart的Path字段 - 给
CinemachineVirtualCamera的Follow和LookAt设置目标(直接绑定相机容器就行)
2. 写控制脚本
新建WheelControlDolly.cs脚本,挂载到相机容器上:
using UnityEngine; using Cinemachine; public class WheelControlDolly : MonoBehaviour { [SerializeField] private CinemachineDollyCart dollyCart; [SerializeField] private float moveSpeed = 10f; // 调整这个值控制移动快慢 private int currentWaypoint = 0; private float[] waypointPositions; void Start() { // 提前获取所有航点在路径上的位置值(0到1区间,按路径顺序) waypointPositions = new float[dollyCart.Path.m_Waypoints.Count]; for (int i = 0; i < waypointPositions.Length; i++) { waypointPositions[i] = dollyCart.Path.GetPathPosition(i); } // 初始定位到第一个航点 dollyCart.m_Position = waypointPositions[currentWaypoint]; } void Update() { // 监听鼠标滚轮输入 float scroll = Input.GetAxis("Mouse ScrollWheel"); if (Mathf.Abs(scroll) < 0.01f) return; // 过滤误触的微小滚动 if (scroll > 0) { // 滚轮向上,切下一个航点 currentWaypoint = Mathf.Min(currentWaypoint + 1, waypointPositions.Length - 1); } else { // 滚轮向下,切上一个航点 currentWaypoint = Mathf.Max(currentWaypoint - 1, 0); } // 平滑移动到目标航点,想要瞬间跳转就改成直接赋值 dollyCart.m_Position = Mathf.Lerp(dollyCart.m_Position, waypointPositions[currentWaypoint], moveSpeed * Time.deltaTime); } }
3. 配置脚本
- 将挂载了
CinemachineDollyCart的物体拖入脚本的dollyCart字段 - 调整
moveSpeed数值:越大相机移动到航点的速度越快
额外说明
- 如果想要相机瞬间跳转到航点,删掉Lerp代码,直接写
dollyCart.m_Position = waypointPositions[currentWaypoint]; - 确保
CinemachinePath的路径点顺序和你想要的移动顺序一致 - 测试时可以把路径点间距拉大,方便观察滚动效果
内容的提问来源于stack exchange,提问作者seanie
相关产品推荐
相关产品推荐

