unity协程

                         unity协程

1.协程的作用:控制一段代码在特定时候执行。
2.协程的开启和停止:
*开启和停止协程的几种方法:`

  1. StartCoroutine(string method); StopCoroutine(string method);2.StartCoroutine(“text”,1);StopCoroutine(“text”);
    3.Coroutine A=StartCoroutine(Text()); StopCoroutine(A);
    4.使用StopCoroutine(IEnumrator routine)停止协程`IEnumrator coroutine1=Text();StartCoroutine(coroutine1);StopCoroutine(coroutine1);
    5.通常使用StopAllCoroutines()函数来停止当前脚本的所有协程。
    注意:使用Stopcoroutine(方法名())无法停止协程,若要停止某个特定的协程需要使用字符串启动协程。
    3.关于yield return:
    在开发过程中最常用到的应当是:yield return null,yield return new WaitForSeconds和yield return new WaitForEndOfFrame了。
    WaitForEndOfFrame即是等到本帧的帧末再进行处理。
    yield return null表示等到下一帧接着再往下处理,yield return +数字也表示暂缓一帧,这种情况下数字是不起作用的,都表示暂缓一帧。
    yield return new WaitForScends()实际时间等于给定时间乘以Time.timeScale的值。
    void Start() { StartCoroutine(Text3()); StartCoroutine(Text2()); StartCoroutine(Text1()); } IEnumerator Text1() { yield return null; Debug.Log(“Text1 is doing”); } IEnumerator Text2() { yield return null; Debug.Log(“Text2 is doing”); } IEnumerator Text3() { yield return new WaitForSeconds(0.1f); Debug.Log(“Text3 is doing”); }
    输出结果:

由此可知,在同一帧里执行两个协程,不论WaitForSeconds给定的值为多少,yield return null所在的协程都要比yield return new WaitForSeconds的协程先执行。同类的协程则跟其开启的先后顺序有关。
4.带参数的协程
StartCoroutine(Text4(5, 1.0f, “Hello”));
IEnumerator Text4(int count,float time,string words) { for(int i=0;i<count;i++) { Debug.Log(words); for(float j =0;j<=time;j+=Time.deltaTime) yield return 0; } }
5.协程的嵌套(通过yield语句来相互嵌套)void Start() { StartCoroutine(Dothings()); } IEnumerator Dothings() { yield return StartCoroutine(Wait(1.0f)); Debug.Log(“1 second has been passed”); yield return StartCoroutine(Wait(2.0f)); Debug.Log(“2 seconds has been passed”); } IEnumerator Wait(float timer) { for (float i = 0; i <= timer; i += Time.deltaTime) yield return 0; }
例子
1.控制物体运动到某个位置
public Vector3 TargetPosition; public float speed = 2.0f; // Start is called before the first frame update void Start() { StartCoroutine(ActionToTarget(TargetPosition)); } IEnumerator ActionToTarget(Vector3 TargetPosition) { while(transform.position!=TargetPosition) { transform.position = Vector3.MoveTowards(transform.position, TargetPosition, speed * Time.deltaTime); } yield return 0; }
2.控制物体在一些点之间移动
public Vector3[] path; public float moveSpeed; void Start() { StartCoroutine(MoveOnPath(true)); } IEnumerator MoveOnPath(bool loop) { do { foreach (var point in path) yield return StartCoroutine(MoveToPosition(point)); } while (loop); } IEnumerator MoveToPosition(Vector3 target) { while (transform.position != target) { transform.position = Vector3.MoveTowards(transform.position, target, moveSpeed * Time.deltaTime); yield return 0; } }
3.使游戏物体在一定时间后消失
public GameObject player; // Start is called before the first frame update void Start() { StartCoroutine(Fade()); } IEnumerator Fade() { for (float i = 0; i < 5;i+=Time.deltaTime) { yield return 0; } Destroy(player); yield return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值