:使用 CameraManager 统一管理游戏摄像机)
项目中往往同时存在主场景摄像机、UI 摄像机、角色预览摄像机和 RenderTexture 摄像机。如果各系统直接操作 UnityCamera主摄像机切换、URP Camera Stack、AudioListener 和跟随逻辑就会散落到不同代码中。MyFramework 使用CameraManager统一管理摄像机并通过GameCamera为 UnityCamera增加组件化能力。项目地址https://github.com/ZHOURUIH/MyFramework一、框架默认摄像机CameraManager.init()会创建MainCamera 默认主摄像机 UICamera UGUI 摄像机 BlurCamera UI 背景模糊摄像机常用接口GameCamera mainCamera mCameraManager.getMainCamera(); GameCamera uiCamera mCameraManager.getUICamera(); GameCamera blurCamera mCameraManager.getUIBlurCamera();业务代码应通过GameCamera操作摄像机而不是反复查找 UnityCamera。二、创建并切换主摄像机场景中存在BattleCamera节点时可以直接创建包装对象public class BattleCameraSystem : FrameSystem { protected GameCamera mBattleCamera; public override void init() { base.init(); mBattleCamera mCameraManager.createCamera( BattleCamera); mCameraManager.setMainCamera( mBattleCamera); } public override void destroy() { mCameraManager .resetToDefaultMainCamera(); mCameraManager.destroyCamera( mBattleCamera); mBattleCamera null; base.destroy(); } }setMainCamera()会停用旧主摄像机再激活新摄像机。销毁当前主摄像机后框架会尝试恢复默认摄像机避免没有可用主摄像机。三、GameCamera 提供的能力GameCamera继承自MovableObject除了位置和旋转还封装了FOV 与正交尺寸 渲染层和 Camera Depth 屏幕坐标转世界坐标 RenderTexture URP Camera Stack 后处理开关 目标跟随组件例如屏幕坐标转换Vector3 worldPos mCameraManager.getMainCamera() .screenToWorld(screenPos, false);设置正交大小mBattleCamera.setOrthoSize(540.0f);设置可见层mBattleCamera.setVisibleLayer(layerMask);四、让摄像机跟随角色GameCamera内置了多种连接器CameraLinkerThirdPerson CameraLinkerSmoothFollow CameraLinkerFirstPerson CameraLinkerFree CameraLinkerSmoothRotate例如平滑跟随玩家CameraLinkerSmoothFollow linker mBattleCamera.linkTarget( typeof(CameraLinkerSmoothFollow), player) as CameraLinkerSmoothFollow; linker.setRelativePosition( new Vector3(0.0f, 6.0f, -8.0f)); linker.setLookAtOffset( new Vector3(0.0f, 1.5f, 0.0f)); linker.setLookAtTarget(true); linker.setNormalSpeed(5.0f); linker.applyRelativePosition( linker.getRelativePosition());连接器默认在LateUpdate中更新可以减少目标移动后摄像机延迟跟随产生的抖动。停止跟随mBattleCamera.unlinkTarget();五、平滑修改 FOVFOV 变化接入了关键帧系统CmdGameCameraFOV.execute( mBattleCamera, 0.25f, 0.0f, mBattleCamera.getFOVY(), 40.0f, KEY_CURVE.QUAD_OUT);可以用于冲刺扩大视野、瞄准缩小视野和剧情镜头拉近。正交摄像机则可以使用CmdGameCameraOrthoSize平滑改变显示范围。六、URP Camera Stack启用 URP 时createCamera()会读取摄像机的RenderType。如果创建的是Overlay摄像机框架会按照overlayCameraDepth排序并默认加入主摄像机的 Camera StackGameCamera sceneUICamera mCameraManager.createCamera( sceneUICameraObject, 10);Base 与 Overlay 摄像机必须位于同一个 Unity Scene。用于 RenderTexture 的摄像机通常不需要 UI Stack创建时应关闭自动添加GameCamera previewCamera mCameraManager.createCamera( previewCameraObject, 0, true, false);七、AudioListener 自动管理Unity 场景中只能有一个启用的AudioListener。CameraManager按以下顺序选择当前主摄像机 ↓ UI 摄像机 ↓ 第一个激活的摄像机切换摄像机时业务层不需要逐个修改AudioListener。八、总结CameraManager负责摄像机的创建、销毁、主摄像机切换、URP Stack 和 AudioListener。GameCamera负责摄像机参数、坐标转换、目标跟随、关键帧变化和 RenderTexture。这样场景切换、角色跟随、UI 叠加和镜头演出都能使用同一套生命周期不需要让每个系统直接操作 UnityCamera。