You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:31:09