直接上例子:
创建一个cube,挂载CubeController脚本
CubeController代码:
public class CubeController : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("time:" + Time.time);
changeColor();
}
}
public void changeColor()
{
transform.GetComponent<Renderer>().material.color = Color.red;
Debug.Log("time:" + Time.time);
}
}
逻辑是:按下鼠标左键时,控制台输出游戏运行时间,cube的颜色变成红色,再输出一次时间。
运行一下:
即,我在游戏3.15秒的时候,按下了鼠标左键,把cube变成了红色。
那么如果说,我想实现:点击鼠标左键两秒之后cube才变红,如何实现呢?
在这种情况下,可以使用Invoke方法和协程去做。
Invoke方法
public class CubeController : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("time:" + Time.time);
Invoke("changeColor", 2f);
}
}
public void changeColor()
{
transform.GetComponent<Renderer>().material.color = Color.red;
Debug.Log("time:" + Time.time);
}
}
调用changeColor()时,用Invoke(string 方法名,float 延迟时间),实现了方法在time这段时间后调用。这里延迟时间我给的实参是2f。
运行一下:
即在1.91s点击鼠标,然后3.90秒变色了。
可以看到,两次输出的time相差约2秒。因为帧率的原因,这个时间只能做到大约准确。
注意【取自网络】:
1 :它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;
2:Invoke(); 只能调用无参方法,因为invoke()形参只有方法名。
3:在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用到;
另外:
还有个InvokeRepeating方法
InvokeRepeating(string 方法名,float 第一次延迟时间,间隔时间)
InvokeRepeating("changeColor", 2f,4f);
即,第一次在两秒后调用,然后每隔四秒调用一次。
协程Coroutine
public class CubeController : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("time:" + Time.time);
StartCoroutine(changeColorWait());
}
}
public void changeColor()
{
transform.GetComponent<Renderer>().material.color = Color.red;
Debug.Log("time:" + Time.time);
}
IEnumerator changeColorWait()
{
yield return new WaitForSeconds(2f);
changeColor();
}
}
区别最开始的代码,多了一个迭代器IEnumerator changeColorWait()
yield return new WaitForSeconds(2f);//等待2秒
其实是等待 2f*Time.timeScale,timescale默认是1,如果timescale变了,也要考虑更改WaitForSeconds的参数。
然后用StartCoroutine方法去调用迭代器changeColorWait,实现了等待2s的功能。
运行一下:
即在1.48s点击鼠标,然后3.48秒变色了。