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;
}
}
}