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

C# 检查变量何时等于另一个值的更好方法,c#,unity3d,C#,Unity3d,当我的游戏运行时,我需要经常检查一个变量。为了简化这个过程,检查是:if(score>=aclementt1){dosomething} 将此检查放入每帧调用的Update()函数中似乎有些过分 因此,我在Start()中调用invokererepeating函数功能: InvokeRepeating ("checkscoreforachievement", 0f, 2f); 这是明智的还是有更好的方法?最终结果应该是,在获得某个分数后的几秒钟内,该成绩被触发 我问这个问题的原因是,当我的游戏

当我的游戏运行时,我需要经常检查一个变量。为了简化这个过程,检查是:
if(score>=aclementt1){dosomething}

将此检查放入每帧调用的
Update()
函数中似乎有些过分

因此,我在
Start()中调用
invokererepeating
函数功能:

InvokeRepeating ("checkscoreforachievement", 0f, 2f);
这是明智的还是有更好的方法?最终结果应该是,在获得某个分数后的几秒钟内,该成绩被触发


我问这个问题的原因是,当我的游戏运行时,我还需要经常做一些事情,所以我最终会有很多这样的过程。想知道这是否是一个太多的资源消耗。找不到有关此主题的好文档

不,
调用重复
在这种情况下并不更好

这并不是更好,因为您每2秒调用一次该函数,这意味着当
score>=AchievementT1
的计算结果为
true
时,将需要大约2秒的时间来检测该值。另外,
invokererepeating
使用的反射速度较慢。在这里使用它没有任何好处。使用
Update
功能,就像您目前正在做的那样,完全可以


与使用
Update
功能相比,一个更好的解决方案是,仅当使用auto属性更改分数时,才检查
score>=achievement1


这只会在设置或更改
score
变量而不是每一帧时进行检查,但是
更新
代码没有问题。

其他一些用户已经指出了类似的问题,但本质上,当分数更改时,调用自己的函数进行检查。不要调用repeating或使用update,因为老实说,不频繁或频繁地分别调用它们是没有必要的

按字面意思设置,当分数增加或减少(以任何方式更改)时,调用函数进行检查

您还可以创建成就数组,并在调用函数显示/更新成就之前检查索引:

if(arrayname[i] != "Unlocked"){
//Call function;
}

也许你可以在更改分数时检查它,然后从那里触发它<代码>分数++//或者如果(score>=achievement1){do something}
我只是想建议@TheSkimek要说什么!我想您也可以使用
调用重复
,然后当您的条件为真时,停止检查它。正如在
if(score>=acgression){CancelInvoke(“yourMethodName”)//以及do something}
中一样,您可能想要探索观察者模式,这通常是用来做这类事情的。。处理分数的游戏对象可以被观察到,因此当分数发生变化时,它将通过回拨通知订阅它的侦听器,回拨可以检查您是否需要条件。这将避免通过这种测试污染你的游戏循环。“想知道这是否是一种太多的资源消耗”不想知道,测试一下是否是。问题是我的分数每秒上下变化10次……但如果成绩在2秒左右被触发,用户不会注意到这一点。我主要关心的是:我想要建立许多类型的成就,而不仅仅是基于分数。如果我需要在更新中通过运行包含许多If语句的“检查成就方法”来检查它们,我担心事情会变慢或消耗资源…现在,我确实意识到还有其他检查方法,但我的评分方法已经很复杂了…即使有你的评论,我的答案仍然有效<代码>调用重复
不应用于此操作。2.您可以使用我上面提到的自动属性。这应该可以做到,而不必在更新函数框架中检查它。它仅在修改变量时进行检查。只需将您将要检查的每个帧的变量替换为auto属性,如我的答案中的
score
变量。
问题是,我的分数每秒上下变化10次
-忽略系统性能瓶颈,
更新
至少每秒调用30次(移动设备),并且可以高达300+,这取决于游戏、系统和禁用的Vsync。。。当一个变量发生变化时,检查它是一种有原因的方法,但即使不是这样,如果您担心的是浪费检查,那么10/s而不是30+/s仍然是一个巨大的改进。。。这可能是一开始的情况。@全能者,这就是我试图告诉OP的。使用
Update
函数可以很好地解决这个问题。调用重复的影响是它很慢。谷歌“C#reflection”看看它是如何工作的。任何可以将字符串作为函数传递给它以便稍后调用的函数都使用反射。由于将函数名(CheckScoreForAchievent)传递给InvokereRepeating函数,因此它没有对checkscoreforachievement函数的直接引用。它必须搜索您的脚本,然后找到
checkscore for chievement
函数。此过程比直接调用CheckScoreForAchevement函数或使用C#中的
操作
功能慢。谢谢您的回答。我意识到我需要重新表述我的问题,所以我编辑了它,见上文。
if(arrayname[i] != "Unlocked"){
//Call function;
}