Unity中实现bool状态变更时仅执行一次相机切换逻辑的方法
解决Unity暂停状态变化时仅执行一次相机切换的方案
方案一:状态对比触发(简单直接)
在相机切换脚本中维护一个记录上一帧暂停状态的变量,仅当当前状态与上一帧状态不一致时执行相机切换逻辑,避免每帧重复执行冗余操作。
修改后的相机脚本代码:
private bool _lastPausedState; void Start() { // 初始化状态并执行一次切换,确保初始相机设置正确 _lastPausedState = PauseController.isPaused; SwitchCameras(); } void Update() { // 仅当暂停状态发生变化时执行切换 if (PauseController.isPaused != _lastPausedState) { SwitchCameras(); _lastPausedState = PauseController.isPaused; } } private void SwitchCameras() { if(PauseController.isPaused) { gameCam.enabled = false; mainCam.cullingMask = pausedLayerMask; } else { gameCam.enabled = true; mainCam.cullingMask = originalLayerMask; } }
方案二:事件驱动(解耦优化)
通过在暂停控制脚本中添加状态变化事件,让相机脚本监听事件,仅在状态变化时触发切换逻辑,这种方式能减少脚本间的直接依赖,更适合大型项目的模块化开发。
第一步:修改PauseController脚本
添加状态变化事件,并在状态改变时触发:
// 定义暂停状态变化事件,外部可监听 public static event System.Action<bool> OnPauseStateChanged; private bool _lastIsPaused; void Start() { _lastIsPaused = isPaused; // 初始化状态时触发一次事件,确保初始相机设置正确 OnPauseStateChanged?.Invoke(isPaused); } void Update() { // 简化isInFront的赋值逻辑 isInFront = InFrontOfScreen(); InView(); Pausing(); // 检查状态是否变化,变化时触发事件 if (isPaused != _lastIsPaused) { OnPauseStateChanged?.Invoke(isPaused); _lastIsPaused = isPaused; } } // 保留原有Pausing、InView等方法不变
第二步:修改相机切换脚本
移除Update中的重复调用,改为监听事件:
void OnEnable() { // 注册事件监听 PauseController.OnPauseStateChanged += HandlePauseStateChanged; } void OnDisable() { // 取消事件监听,避免内存泄漏 PauseController.OnPauseStateChanged -= HandlePauseStateChanged; } private void HandlePauseStateChanged(bool isPaused) { if(isPaused) { gameCam.enabled = false; mainCam.cullingMask = pausedLayerMask; } else { gameCam.enabled = true; mainCam.cullingMask = originalLayerMask; } }
两种方案都能实现仅在isPaused状态变化时执行一次相机切换的需求,状态来回切换时也能正常触发逻辑。方案一适合小型项目快速实现,方案二更符合模块化开发的最佳实践。
内容的提问来源于stack exchange,提问作者Janesh Parnami
相关产品推荐
相关产品推荐

