大将军 发表于 2012-12-15 19:54

Unity3D等待函数介绍

Coroutines & Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines & Yield,在语法上却有一些区别:

yield不可单独使用
需要与return配合使用,例如:

1 yield return 0; //等0帧

2 yield return 1; //等1帧

3 yield return WaitForSeconds(3.0); //等待3秒

所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:

1 IEnumerator DoSomeThingInDelay() {...}

最后,也是在”Using C#”这个章节中没有讲到的关键一点是,所有IEnumerator类型函数必须使用”StartCoroutine”这个函数触发,不能单独使用,例如:

1 StartCoroutine(DoSomeThingInDelay());

最后附上学习Coroutines & Yield时所做的小例子,脚本的作用是不断随机改变材质的颜色,演示demo使用”V字仇杀队”中的******。

using UnityEngine;

using System.Collections;



public class RandomColor : MonoBehaviour {



public float delayInSecond = 1;

public Material targetMaterial;



// Use this for initialization

void Start () {

StartCoroutine(AutoChangeColor());

}



// Update is called once per frame

void Update () {

}



IEnumerator AutoChangeColor()

{

yield return 0; //确保Time.deltaTime为0



Color colorNew = GenerateRandomColor();

Color colorNow = targetMaterial.GetColor("_Color");

float timeEclapsed = 0;

for (timeEclapsed = 0; timeEclapsed < delayInSecond; timeEclapsed += Time.deltaTime)

{

float progress = timeEclapsed / delayInSecond;

Color colorTween = new Color(

(colorNew.r - colorNow.r) * progress + colorNow.r,

(colorNew.g - colorNow.g) * progress + colorNow.g,

(colorNew.b - colorNow.b) * progress + colorNow.b

);

targetMaterial.SetColor("_Color", colorTween);

yield return 1;

}



StartCoroutine(AutoChangeColor());

}



Color GenerateRandomColor(){

Color color = new Color();

color.r = Random.value;

color.g = Random.value;

color.b = Random.value;

   

return color;
}

}

仟层浪 发表于 2017-2-8 20:04

很不错

江南 发表于 2017-2-8 19:54

好帖就是要顶

Royalbook_lee 发表于 2017-2-8 19:40

难得一见的好帖

huasheng123 发表于 2017-2-8 19:26

很好哦

7759367 发表于 2017-2-8 19:55

LZ真是人才

bobparr 发表于 2017-2-12 07:58

很不错

xiaoanhuafei 发表于 2017-2-12 07:41

好帖就是要顶

killkiss 发表于 2017-2-12 07:24

真心顶

hxcspitfire 发表于 2017-2-12 07:34

很好哦
页: [1] 2 3 4 5 6 7
查看完整版本: Unity3D等待函数介绍