检查变量何时等于另一个值的更好方法

Kil*_*ert 2 c# unity-game-engine

我有一个变量,我需要在游戏运行时经常检查.为了简化这一点,检查是:if (score >= achievement1) {do something}.

把这个检查放在Update()每帧调用的函数中似乎有点过分了.

所以相反,我在InvokeRepeating函数中调用Start ();函数:

InvokeRepeating ("checkscoreforachievement", 0f, 2f);
Run Code Online (Sandbox Code Playgroud)

这样聪明还是有更好的方法呢?最终结果应该是在达到一定分数后的几秒钟内,触发成就.

我问的原因是,当我的游戏运行时,我还需要做更多的事情,所以我最终会选择其中的一些进程.想知道这是不是太多的资源消耗.找不到关于这个主题的好文档.

Pro*_*mer 5

不,InvokeRepeating在这种情况下不是更好.

它并不是更好,因为你每2秒调用一次该函数,这意味着当score >= achievement1评估时true,它将需要大约2秒来检测.此外,InvokeRepeating使用缓慢的反射.在这里使用它没有任何优势.使用Update像你目前正在做的功能是完全没问题的.


比使用该Update功能更好的解决方案是检查是否score >= achievement1 仅在使用auto属性更改分数时.

public int achievement1 = 0;
private float _score;

public float score
{
    get
    {
        return _score;
    }

    set
    {
        if (_score != value)
        {
            _score = value;

            if (_score >= achievement1)
            {
                //Do something
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这只会在score设置或更改变量而不是每一帧时进行检查,但Update代码很好.

  • 即使你的评论,我的答案仍然有效.不应该使用`InvokeRepeating`.你可以使用我上面提到的汽车财产.这应该在不更新功能的框架中检查它.它仅在修改变量时才进行检查.只需用我的答案中的`score`变量替换你将使用auto属性检查每一帧的变量. (2认同)
  • "问题是我的分数每秒上下变换10次" - 忽视系统性能瓶颈,"更新"每秒至少被调用30次(移动设备),并且可以高达300+,具体取决于游戏,系统和禁用Vsync ...当一个变量被改变时检查它是**这样做的原因,但即使不是这样,10/s而不是30 +/s仍然是如果您的担忧是浪费的检查,那将是一个巨大的改进......首先,这可能是[过早优化](https://softwareengineering.stackexchange.com/a/80092/191857)的情况. (2认同)