在MonoBehaviour上模拟Update()调用

时间:2015-02-22 19:15:59

标签: c# unity3d

如何直接调用Update()或Start()或任何其他MonoBehaviour方法?

我通过在每个上面设置enabled = false;来禁用我的大多数MonoBehaviour自动Update()调用,因为我需要在非常特定的时间为这些脚本安排Update()。

我正在考虑这样做:

List<MonoBehaviour> disabledScripts;
foreach (MonoBehaviour m in disabledScripts)
    m.Update();

但是我不确定这是否是正确的方法,因为并非所有在disabledScripts中的MonoBehavi都实现了Update()。

2 个答案:

答案 0 :(得分:1)

在对象启动时自动调用Start,引擎会在每帧上自动调用Update。

如果要控制调用脚本的Start()或Update()方法的顺序,请查看此http://docs.unity3d.com/Manual/class-ScriptExecution.html

如果您需要在受控时间或某些条件下执行某些代码,最好为每个对象创建一个特定方法,并创建一个控制器,以便在所需时间对每个对象调用此方法。

例如,您可以为每个对象保留Update()方法为空,并创建一个名为MyUpdate的方法(如果您愿意,可以使用参数),并根据您的游戏工作流程从控制器中调用它。

Unity的基本流程必须保持不变,因为它可能导致奇怪的行为。我无法想到Unity无法完成的自然流程。

编辑: 好的,我知道你不想创建复杂的功能只是为了尝试一些东西。

正如您所说,禁用该行为会强制引擎避免在给定MonoBehavi的每个帧上调用Update,但我不认为您可以按照建议调用Update,因为在MonoBehaviour中,Update没有方法修饰符(见method without access modifier

无论如何,我会创建一个&#34; MyMonoBehaviour&#34;使用MyUpdate()函数扩展MonoBehaviour,您将覆盖每个扩展MyMonoBehaviour的对象。你可以调用MyUpdate函数做类似的事情(非常类似于你提出的代码):

List<MyMonoBehaviour> disabledScripts;
foreach (MyMonoBehaviour m in disabledScripts)
    m.MyUpdate();

答案 1 :(得分:1)

好吧我明白了:

script.Update();

编译错误,正确的方法是:

script.SendMessage("Update");

我还发现设置enabled = false;也会禁用其他一些方法,比如Start(),所以我想我只是扩展MonoBehaviour并将所有Update()代码移动到MyUpdate(),如antonio所说。 / p>