Coroutines & Yield是Unity3D编程ä¸é‡è¦çš„概念,它å¯ä»¥å®žçŽ°å°†ä¸€æ®µç¨‹åºå»¶è¿Ÿæ‰§è¡Œæˆ–者将其å„个部分分布在一个时间段内连ç»æ‰§è¡Œï¼Œä½†æ˜¯åœ¨Javascript与C#ä¸å®žçŽ°Coroutines & Yield,在è¯æ³•ä¸Šå´æœ‰ä¸€äº›åŒºåˆ«ï¼š
yieldä¸å¯å•ç‹¬ä½¿ç”¨ï¼Œéœ€è¦ä¸Žreturné…åˆä½¿ç”¨ï¼Œä¾‹å¦‚:
[csharp]
yield return 0; //ç‰0帧
yield return 1; //ç‰1帧
yield return WaitForSeconds(3.0); //ç‰å¾…3秒
[/csharp]
所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:
[csharp]
IEnumerator DoSomeThingInDelay() {…}
[/csharp]
最åŽï¼Œä¹Ÿæ˜¯åœ¨”Using C#”è¿™ä¸ªç« èŠ‚ä¸æ²¡æœ‰è®²åˆ°çš„关键一点是,所有IEnumerator类型函数必须使用”StartCoroutine”这个函数触å‘,ä¸èƒ½å•ç‹¬ä½¿ç”¨ï¼Œä¾‹å¦‚:
[csharp]
StartCoroutine(DoSomeThingInDelay());
[/csharp]
[csharp]using UnityEngine;
using System.Collections;
public class RandomColor : MonoBehaviour
{
public float delayInSecond = 1;
public Material targetMaterial;
// Use this for initialization
void Start ()
{
StartCoroutine (AutoChangeColor ());
}
IEnumerator AutoChangeColor ()
{
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;
}
}[/csharp]