如何让Cinemachine主相机锁定全局偏移而非局部偏移?
解决Cinemachine追踪高尔夫球时偏移随球旋转的问题
- 核心问题:你当前设置的瞄准/机身偏移是基于高尔夫球的局部坐标系,球在空中旋转时局部坐标系同步转动,相机偏移自然会失控。要实现全局空间的固定偏移,试试这几个实用方法:
方法1:用空物体做跟踪目标(最简单高效)
- 在高尔夫球的层级下新建一个空GameObject(比如命名为
BallCameraTarget) - 让这个空物体的初始位置和球完全重合,禁止它继承球的旋转——可以手动锁定空物体的旋转参数为(0,0,0),或者写一行小脚本让它只同步球的位置、不同步旋转
- 把Cinemachine虚拟相机的
Follow和Look At目标换成这个空物体 - 现在在相机的
Body或Aim模块里设置的偏移,就是基于全局空间的固定偏移,球怎么旋转都不会影响相机姿态
方法2:用脚本强制控制世界空间偏移
如果不想额外加空物体,写个简单脚本挂在虚拟相机上,直接用世界空间定义偏移:
using UnityEngine; using Cinemachine; public class GlobalCameraOffset : MonoBehaviour { public Vector3 worldOffset = new Vector3(0, 2, -5); // 自定义你需要的全局偏移参数 private CinemachineVirtualCamera vCam; void Start() { vCam = GetComponent<CinemachineVirtualCamera>(); } void LateUpdate() { if (vCam.Follow != null) { // 计算相机在世界空间的目标位置:球的位置 + 全局偏移 Vector3 targetPos = vCam.Follow.position + worldOffset; // 让相机始终看向球 transform.LookAt(vCam.Follow.position); // 固定相机位置 transform.position = targetPos; } } }
注意:使用这个脚本时,要把虚拟相机的Body模块改成Do Nothing,避免和脚本逻辑冲突
补充说明
你之前尝试的自由视角相机没用,本质原因还是没有把跟踪目标和球的旋转解耦,只要跟踪目标是球本身,偏移就会绑定到球的局部坐标系,必然跟着旋转失控。
内容的提问来源于stack exchange,提问作者Wolde North
相关产品推荐
相关产品推荐

