除非需要,否则禁用Unity Update

时间:2018-01-10 09:57:24

标签: unity3d

我想为文本元素创建一个倒计时效果,特别是TextMeshProUGUI。我的想法是将一个脚本附加到我想要使用效果的每个TextMeshProUGUI,并在我想动态更改TextMeshProUGUI UI元素时调用startEffect()方法。

现在,如果我在每个TextMeshProUGUI元素上添加该脚本,它将自动调用每个帧上的Update()方法。但是,只要效果继续,我只需要执行Update(),这可能是1-2秒。

这样做的最佳方式是什么?我想过可能有一个接受TextMeshProUGUI作为参数的类,但不知怎的,现在它感觉像" Unity" - 就像有一个可序列化的编辑器TextMeshProUGUI字段,它只是附加到每个TextMeshProUGUI元素。但它确实有缺点,只要元素在后台运行,就运行Update()。

处理这种情况的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

首先,我希望能正确理解你的问题。如果你想对对象启用一些效果,然后禁用它上面的每个逻辑(永远),你可以这样做:

public void Update(){
   //...do your logic until the end...
   enabled = false;   //This will disable this component (script) forever
}

如果可以多次触发逻辑,只需使用标志......

public void Update(){
   if (update_is_needed){
      //do your logic...
   }
}

并且忽略Update调用给出的开销,是无关紧要的。 我希望这会有所帮助,而不是低估你的需求。

更新:好的,我知道你要做什么。你可以这样做(未经测试):

1)声明将更新标签的协程:

IEnumerator IncreaseMoney(amount) {
        for (int i = actualMoney; i <= actualMoney + amount; i++)
        {
            moneyGUI.text = i.toString();
            yield return new WaitForSeconds(0.1f);
        }
    }
}

2)调用它(例如:在带有货币对象的OnCollisionEnter()中)

StartCoroutine (IncreaseMoney(amount));

正如我所说,我现在无法测试,希望它是一个有效的起点。 并且,我假设您使用C#进行编码。