Unity的Timer的示例
using System.Collections;
using System.Collections.Generic;
using System.Timers;
using UnityEngine;
private void Start()
{
Timer t = new Timer();
t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
t.Interval = 3000;
t.Enabled = true;
}
//Every three seconds I need to do something
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Do Something
}
上面是Timer的简单的例子,然后看一下文档微软的Timer文档,Unity的文档没有找到。 如果要在Timer中做一些操作,就比如修改UI的操作,操作游戏物体等等这些对于Unity主线程的操作都是不可以的。 例如下面这个例子:
using UnityEngine;
using UnityEngine.UI;
using System.Timers;
public class CreatCube : MonoBehaviour
{
public GameObject ScoalCube;//需要缩放的Cube,用于演示操作场景中的GameObject
private int i = 0;
public Text text;//用于演示不可以操作UI
Timer t = new Timer();//创建一个TImer对象
void Start()
{
t.Elapsed += new ElapsedEventHandler(OnTimedEvent);//设置timer,以及对应的函数
t.Interval = 1500;//1.5秒会触发一次timer事件
t.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)//TImer会触发的函数
{
Debug.Log("111'");
i++;
ScoalCube.gameObject.transform.localScale = new Vector3(i,i,i);//每次放大这个Cube
text.text = i.ToString();//显示 i
Debug.Log("22222");
}
private void OnApplicationQuit()//解除Timer的占用,不然退出也会执行timer的触发函数
{
t.Close();
}
}
然后放到Unity中运行 白色为参照物,红色为修改对象,New Text 为Text的UI。 接下来运行 卡伊看到打印出了111 但是没有打印出222 ,并且UI的文字并没有发生改变Cube的大小没有改变。并且也没有报错。 原因:Timer是使用一个线程来进行了,Unity中只允许主线程操作gameIbject所以没有变化。怎么解决呢?可以尝试使用协程,或者使用Updata一直刷新,然后在timer的函数中使用一个bool值来控制Updata的刷新。
本文章用于纪念2021年10月15日的一个bug.
|