角色能力,存档
This commit is contained in:
@@ -5,20 +5,19 @@ namespace BaseGames.Camera
|
||||
{
|
||||
/// <summary>
|
||||
/// 相机区域数据组件。一个房间场景内可放置任意数量的 CameraArea,
|
||||
/// 每个区域独立定义限位范围、可视边界与混合配置。
|
||||
/// 每个区域独立定义限位范围、可视边界、跟随参数与混合配置。
|
||||
///
|
||||
/// 运行时由 <see cref="CameraStateController"/> 管理:
|
||||
/// - <c>_dedicatedCamera</c> 为空 → 使用 Persistent 场景中的两台全局 VCam 交替承接,
|
||||
/// 减少场景内 VCam 数量,相机参数统一由全局 VCam 配置。
|
||||
/// - <c>_dedicatedCamera</c> 不为空 → 激活该专有 VCam(优先级高于全局 VCam),
|
||||
/// 适用于需要独特相机参数(FOV / Offset / 阻尼)的特殊区域。
|
||||
/// 每个区域均拥有专属的 <c>_dedicatedCamera</c>,进入该区域时激活其专属 VCam。
|
||||
/// <c>OverrideFollowBehaviour</c> 为真时,<see cref="CameraStateController"/> 会将本组件中的
|
||||
/// 跟随参数应用到专属 VCam;否则 VCam 保持 Inspector 中的默认值。
|
||||
/// </summary>
|
||||
public class CameraArea : MonoBehaviour
|
||||
{
|
||||
[Header("限位区域")]
|
||||
[Tooltip("定义相机移动边界的 PolygonCollider2D(通常挂载在子节点 AreaBoundary 上)。\n" +
|
||||
"会被赋给全局 VCam 的 CinemachineConfiner2D.BoundingShape2D。")]
|
||||
[SerializeField] private PolygonCollider2D _confinerCollider;
|
||||
[Tooltip("定义相机移动边界的 BoxCollider(通常挂载在子节点 AreaBoundary 上)。\n" +
|
||||
"会被绑定到专属 VCam 的 CinemachineConfiner3D.BoundingVolume。")]
|
||||
[SerializeField] private BoxCollider _confinerCollider;
|
||||
|
||||
[Header("可视区域(透视相机)")]
|
||||
[Tooltip("摄像机应显示的最大可视矩形(本地坐标,相对于此 GameObject 的 Transform 位置)。\n" +
|
||||
@@ -30,8 +29,7 @@ namespace BaseGames.Camera
|
||||
[SerializeField] private float _cameraDepth = 0f;
|
||||
|
||||
[Header("镜头配置")]
|
||||
[Tooltip("全局相机镜头参数 SO。与 CameraStateController 引用同一资产,\n" +
|
||||
"保证 FOV 等参数在 Room 场景中也能正确读取。\n" +
|
||||
[Tooltip("相机镜头参数 SO,提供 FOV、相机深度等参数。\n" +
|
||||
"SO 中的 fieldOfView 发生变化时,编辑器会自动重新同步限位多边形。")]
|
||||
[SerializeField] private CameraLensConfigSO _lensConfig;
|
||||
|
||||
@@ -40,9 +38,9 @@ namespace BaseGames.Camera
|
||||
[SerializeField] private float _lastSyncFOV = 0f;
|
||||
// ── 跟随行为 ──────────────────────────────────────────────────────────
|
||||
|
||||
[Header("跟随行为(覆盖全局 VCam 参数)")]
|
||||
[Tooltip("启用后,进入此区域时将把以下参数写入全局 VCam;\n" +
|
||||
"关闭则 VCam 保持上一区域或 Inspector 中的默认值。")]
|
||||
[Header("跟随行为(专属 VCam 参数)")]
|
||||
[Tooltip("启用后,激活此区域时将以下参数应用到专属 VCam;\n" +
|
||||
"关闭则 VCam 保持 Inspector 中的默认参数不作任何覆写。")]
|
||||
[SerializeField] private bool _overrideFollowBehaviour = true;
|
||||
|
||||
[Tooltip("玩家跟踪点在屏幕上的位置(0 = 中心,±0.5 = 边缘)。\n" +
|
||||
@@ -78,6 +76,20 @@ namespace BaseGames.Camera
|
||||
+ "防止相机因偏置超出 Confiner 边界。")]
|
||||
[SerializeField] private bool _disableFallBias = false;
|
||||
|
||||
// ── 方向感知水平偏置 ──────────────────────────────────────────────────
|
||||
|
||||
[Header("方向感知偏置(需配合 CameraFacingBiasExtension)")]
|
||||
[Tooltip("是否覆盖此区域的方向感知水平偏置量。\n"
|
||||
+ "关闭时使用 CameraFacingBiasExtension 组件的默认值;\n"
|
||||
+ "开启后可将此区域的偏置设为 0(禁用)或更小值(如窄走廊)。")]
|
||||
[SerializeField] private bool _overrideFacingBias = false;
|
||||
|
||||
[Tooltip("方向感知水平偏置量(世界单位)。\n"
|
||||
+ "0 = 禁用此区域的方向偏置(推荐用于宽度受限的走廊)。\n"
|
||||
+ "仅在 Override Facing Bias = true 时生效。")]
|
||||
[Min(0f)]
|
||||
[SerializeField] private float _facingBiasOverride = 0f;
|
||||
|
||||
// ── 轴向约束 ──────────────────────────────────────────────────────────
|
||||
|
||||
[Header("轴向约束")]
|
||||
@@ -87,8 +99,9 @@ namespace BaseGames.Camera
|
||||
[Tooltip("锁定相机 Y 轴(水平走廊:相机仅左右移动,Y 固定在限位区域中心)。")]
|
||||
[SerializeField] private bool _lockVertical = false;
|
||||
|
||||
[Header("镜头尺寸(正交相机)")]
|
||||
[Tooltip("进入此区域时的目标正交尺寸(0 = 不覆盖当前尺寸)。\n" +
|
||||
[Header("镜头尺寸(视野缩放)")]
|
||||
[Tooltip("进入此区域时的目标可视半高(世界单位,0 = 不覆盖)。\n" +
|
||||
"等价于正交相机的 OrthographicSize,透视相机下自动换算为 FOV。\n" +
|
||||
"适用于 Boss 战拉远或精密解谜区域拉近。")]
|
||||
[SerializeField] private float _lensSize = 0f;
|
||||
|
||||
@@ -99,18 +112,31 @@ namespace BaseGames.Camera
|
||||
[Header("混合配置")]
|
||||
[SerializeField] private CameraBlendProfileSO _blendProfile;
|
||||
|
||||
[Header("专有虚拟相机(可选)")]
|
||||
[Tooltip("为空时由全局双 VCam 交替过渡(推荐,节省 VCam 数量)。\n" +
|
||||
"不为空时激活此专有 CinemachineCamera,优先级高于全局 VCam。\n" +
|
||||
"适用于需要独特 FOV / Noise / LookAt 等参数的特殊区域。")]
|
||||
[Header("相机噪音(氛围震动)")]
|
||||
[Tooltip("此区域的相机噪音配置(Noise Settings 资产)。\n"
|
||||
+ "洞穴、水下、机械区等需要氛围震动时使用;留空则禁用噪音(AmplitudeGain = 0)。\n"
|
||||
+ "专属 VCam 已包含 CinemachineBasicMultiChannelPerlin 组件(使用工具创建时自动附加)。")]
|
||||
[SerializeField] private NoiseSettings _noiseProfile;
|
||||
|
||||
[Tooltip("噪音振幅增益(0 = 无震动,推荐 0.2 ~ 0.8)。")]
|
||||
[Min(0f)]
|
||||
[SerializeField] private float _noiseAmplitude = 0.5f;
|
||||
|
||||
[Tooltip("噪音频率增益(倍率;1 = 资产原始频率,越大震动越快)。")]
|
||||
[Min(0.01f)]
|
||||
[SerializeField] private float _noiseFrequency = 1f;
|
||||
|
||||
[Header("虚拟相机")]
|
||||
[Tooltip("此区域的专属 CinemachineCamera。\n" +
|
||||
"每个区域均应配置自己的专属 VCam,可通过编辑器工具(Camera Area Setup)一键创建。")]
|
||||
[SerializeField] private CinemachineCamera _dedicatedCamera;
|
||||
|
||||
[Tooltip("专有 VCam 激活时使用的优先级,须高于全局 VCam 的 _globalActivePriority(默认 10)。")]
|
||||
[Tooltip("专属 VCam 激活时使用的优先级,默认 20。")]
|
||||
[SerializeField] private int _dedicatedPriority = 20;
|
||||
|
||||
// ── 公开属性 ──────────────────────────────────────────────────────────
|
||||
|
||||
public PolygonCollider2D ConfinerCollider => _confinerCollider;
|
||||
public BoxCollider ConfinerCollider => _confinerCollider;
|
||||
public CameraLensConfigSO LensConfig => _lensConfig;
|
||||
public float LastSyncFOV => _lastSyncFOV;
|
||||
public CameraBlendProfileSO BlendProfile => _blendProfile;
|
||||
@@ -129,12 +155,17 @@ namespace BaseGames.Camera
|
||||
public float LookaheadTime => _lookaheadTime;
|
||||
public float LookaheadSmoothing => _lookaheadSmoothing;
|
||||
public bool DisableFallBias => _disableFallBias;
|
||||
public bool OverrideFacingBias => _overrideFacingBias;
|
||||
public float FacingBiasOverride => _facingBiasOverride;
|
||||
public bool LockHorizontal => _lockHorizontal;
|
||||
public bool LockVertical => _lockVertical;
|
||||
public float DampingDown => _dampingDown;
|
||||
public float DampingUp => _dampingUp;
|
||||
public float LensSize => _lensSize;
|
||||
public float LensSizeDuration => _lensSizeDuration;
|
||||
public NoiseSettings NoiseProfile => _noiseProfile;
|
||||
public float NoiseAmplitude => _noiseAmplitude;
|
||||
public float NoiseFrequency => _noiseFrequency;
|
||||
|
||||
/// <summary>
|
||||
/// 摄像机到场景平面的有效深度(用于透视视口换算)。
|
||||
@@ -150,6 +181,16 @@ namespace BaseGames.Camera
|
||||
}
|
||||
}
|
||||
|
||||
// ── Lifecycle ────────────────────────────────────────────────────────
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// 确保专属 VCam 启动时 Priority=0,无论 Inspector 保存了什么值。
|
||||
// CameraStateController.ActivateDedicated 会在进入区域时将其提升到 DedicatedPriority。
|
||||
if (_dedicatedCamera != null)
|
||||
_dedicatedCamera.Priority = 0;
|
||||
}
|
||||
|
||||
// ── Gizmo ────────────────────────────────────────────────────────────
|
||||
|
||||
private void OnDrawGizmosSelected()
|
||||
|
||||
Reference in New Issue
Block a user