chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
using System.Collections.Generic;
using UnityEngine;
using Unity.Cinemachine;
namespace BaseGames.Camera
{
/// <summary>
/// 相机状态单例控制器。管理房间相机切换、限位器更新与屏幕抖动。
/// 须放置在持久化场景中。
/// </summary>
[DefaultExecutionOrder(-100)]
public class CameraStateController : MonoBehaviour
{
public static CameraStateController Instance { get; private set; }
[Header("引用")]
[SerializeField] private CinemachineBrain _brain;
[SerializeField] private CinemachineImpulseSource _impulseSource;
[Header("默认混合配置")]
[SerializeField] private CameraBlendProfileSO _defaultBlendProfile;
// ── 注册表 ────────────────────────────────────────────────────────────
private readonly HashSet<RoomCamera> _registeredCameras = new HashSet<RoomCamera>();
private RoomCamera _activeCamera;
// ── Unity Lifecycle ───────────────────────────────────────────────────
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
}
private void OnDestroy()
{
if (Instance == this) Instance = null;
}
// ── 公开 API ──────────────────────────────────────────────────────────
/// <summary>向控制器注册一个房间相机(可选,也可由触发器直接调用 SwitchRoom。</summary>
public void RegisterRoomCamera(RoomCamera camera)
{
if (camera != null) _registeredCameras.Add(camera);
}
/// <summary>注销房间相机。</summary>
public void UnregisterRoomCamera(RoomCamera camera)
{
if (camera != null) _registeredCameras.Remove(camera);
}
/// <summary>切换到目标房间相机,并应用对应的混合配置。</summary>
public void SwitchRoom(RoomCamera targetCamera)
{
if (targetCamera == null || targetCamera == _activeCamera) return;
// 应用混合配置到 Brain
if (_brain != null)
{
var profile = targetCamera.BlendProfile ?? _defaultBlendProfile;
if (profile != null)
_brain.DefaultBlend = profile.ToBlendDefinition();
}
// 禁用旧相机、启用新相机
_activeCamera?.Deactivate();
_activeCamera = targetCamera;
_activeCamera.Activate();
}
/// <summary>触发屏幕抖动。</summary>
public void TriggerImpulse(Vector3 velocity)
{
if (_impulseSource != null)
_impulseSource.GenerateImpulse(velocity);
}
/// <summary>以默认强度触发屏幕抖动。</summary>
public void TriggerImpulse(float strength = 0.3f)
=> TriggerImpulse(Vector3.down * strength);
}
}