所以我正在用摄像头做一个项目。如果我离开屏幕(摄像头视图),计时器会启动,跟踪我离开视图的时间,如果超过某个最大值,我的游戏会暂停。同样,对于屏幕内视图(摄像头内视图),计时器会启动,在达到最大值后,它会恢复游戏。
void Update()
{
if (InFrontOfScreen()) //This is a condition
{
isInFront = true;
}
else
{
isInFront = false;
}
InView();
Pausing();
}
private void Pausing()
{
if (isPaused)
Time.timeScale = 0f;
else
Time.timeScale = 1f;
}
private void InView()
{
if (isInFront)
{
inViewTime += Time.unscaledDeltaTime;
if (inViewTime >= maxInViewTime)
{
isPaused = false;
}
outOfViewTime = 0f;
}
else
{
outOfViewTime += Time.unscaledDeltaTime;
if (outOfViewTime >= maxOutOfViewTime)
{
isPaused = true;
}
inViewTime = 0f;
}
}
现在,在另一个脚本中,我必须调用依赖于游戏是否暂停的函数。
void Update()
{
SwitchCameras();
}
private void SwitchCameras()
{
if(PauseController.isPaused)
{
gameCam.enabled = false;
mainCam.cullingMask = pausedLayerMask;
}
else
{
gameCam.enabled = true;
mainCam.cullingMask = originalLayerMask;
}
}
问题是,当布尔值isPaused改变时,gameCam.enabled和mainCam应该只被调用一次。它在每一帧都被调用。我得到了正确的答案,但我希望它只被调用一次,而不是每一帧。有办法实现这一点吗?虽然isPaused可以来回改变,但当isPaused改变时,函数应该被调用一次,然后再调用一次。谢谢
3条答案
按热度按时间dgjrabp21#
从我所看到的,您只需要缓存值,当调用新的更新时,只需检查值是否更改
gfttwv5a2#
我们可以使用一个私有变量和一个属性。这样我们就可以检查属性何时改变值,并且在值改变时只处理一个操作。
很快,这应该是一种实现你想要做的事情的方法:
mzaanser3#
问题是gameCam.enabled和mainCam应该只在bool isPaused改变时调用一次
在这种情况下(一般情况下),您根本不应该轮询
Update
中的检查标志,而是让您的代码React式事件驱动,并且只在值实际更改时做出一次React。所以在你的第一个剧本里我会加一个
无论何时设置
isPaused
的状态,都要相应地调用事件,并在负责类中执行更改检查,而不是所有侦听器都必须自己跟踪它然后在其他脚本中附加一个侦听器,该侦听器仅在调用事件时-〉状态实际更改时才被调用
遵循同样的原则,您还可以使第一个脚本的其余部分以相同的方式React,而不是在
Update
中调用每一帧的内容,我可能会使用Coroutine并执行以下操作