using UnityEngine; using Unity.Cinemachine; namespace BaseGames.Camera { /// /// Cinemachine 扩展:在 Body 阶段之后硬锁定相机某一轴向。 /// /// 用途: /// - = true → 垂直竖井 / 电梯:相机仅上下移动,X 固定于限位区域中心。 /// - = true → 水平走廊:相机仅左右移动,Y 固定于限位区域中心。 /// /// 由 在切换区域时自动写入 / /// (从 ConfinerCollider.bounds.center 取值)并切换锁定开关。 /// [AddComponentMenu("Cinemachine/Extensions/Camera Axis Lock")] [DisallowMultipleComponent] public class CameraAxisLockExtension : CinemachineExtension { /// 锁定 X 轴(垂直竖井)。 [HideInInspector] public bool LockX = false; /// 锁定 Y 轴(水平走廊)。 [HideInInspector] public bool LockY = false; /// X 轴锁定到的世界坐标(由 CameraStateController 写入)。 [HideInInspector] public float LockedX = 0f; /// Y 轴锁定到的世界坐标(由 CameraStateController 写入)。 [HideInInspector] public float LockedY = 0f; protected override void PostPipelineStageCallback( CinemachineVirtualCameraBase vcam, CinemachineCore.Stage stage, ref CameraState state, float deltaTime) { if (stage != CinemachineCore.Stage.Body) return; var pos = state.RawPosition; if (LockX) pos.x = LockedX; if (LockY) pos.y = LockedY; state.RawPosition = pos; } } }