unity协同程序(协程)

一般协程使用是避免新能开销,减少update使用,当有很多 计时器时,不用定义很多float 变量,一个协程就可以解决。

原文:http://www.un点击打开链接ity.5helpyou.com/2658.html

2.协同程序的特点

1、协程在中断指令(YieldInstruction)产生时暂停执行

2、协程一暂停执行便立即返回 //中断协程后返回主函数,暂停结束后继续执行协程剩余的函数。

3、中断指令完成后从中断指令的下一行继续执行

4、同一时刻、一个脚本实例中可以有多个暂停的协程,但只有一个运行着的协程

5、函数体全部执行完后,协程结束

6、协程可以很好的控制跨越一定帧数后执行的行为

7、协程在性能上、相比于一般函数几乎没有更多的开销


  指令                      描述                          实现

WaitForSeconds          等待指定秒数            yield return new WaitForSeconds(2);

WaitForFixedUpdate      等待一个固定帧          yield return new WaitForFixedUpdate();

WaitForEndOfFrame       等待帧结束              yield return new WaitForEndOfFrame();                         

StartCoroutine          等待一个新协程暂停      yield return StartCoroutine(other coroutine);

WWW                     等待一个加载完成        yield return www;

注意:

1、一个协程A里在中断指令里再启动一个协程B,在yield return StartCoroutine时执行的顺序是:

①:先执行新协程B;

②:新协程B暂停后向上返回协程A,A协程暂停,返回协程A的上层函数;

③:因为决定协程A是否结束的标志是新协程B是否结束,所以当新协程B结束后返回协程A继续执行余下的内容;

④:协程A执行结束。

//每3秒执行一次
    while(true){
        //to do something
        yield return new WaitForSeconds(3);
    }

8.例子

lg1、举例说明协同程序的执行流程

 

using UnityEngine;
using System.Collections;

public class SimpleCoroutine : MonoBehaviour {
/// <summary>
/// Start, 协程的执行流程
/// Start函数运行,输出“1”,然后开始协程Do;
/// Do输出“2”,然后开始协程newDo;
/// newDo输出“3”,产生中断指令后暂停,立即返回Do;
/// Do产生中断指令后暂停,Do暂停并立即返回Start函数;
/// Start执行StartCoroutine的下一条语句:输出“4”;
/// 2秒后,newDo的中断指令完成并继续执行,输出“5”,协程newDo结束;
/// Do的中断指令因为协程newDo的结束而完成并继续执行,输出“6”,协程Do结束。
/// </summary>
void Start () {
Debug.Log(“1”);
StartCoroutine(Do());
Debug.Log(“4”);
}
IEnumerator Do() {
Debug.Log(“2”);
yield return StartCoroutine(newDo());//WaitForSeconds(5);
Debug.Log(“6”);
}
IEnumerator newDo() {
Debug.Log(“3”);
yield return new WaitForSeconds(2);
Debug.Log(“5”);
}
}
//输出结果顺序是,1,2,3,4,5,6

[/csharp]

lg2、加载指令(通过WWW加载本地文件)

?
1
 

private string path = “file://F:/Resource/Dragon.unity3d”;
void OnGUI(){
if(GUI.Button(new Rect(200,200,150,30),”点击进入协同程序”)){
Debug.Log(“1”);
StartCoroutine(loadLocalBundle(path));
Debug.Log(“3”);
}
}
private IEnumerator loadLocalBundle(string url){
Debug.Log(“2”);
using(WWW www = new WWW(url)){
yield return www;
Debug.Log(“4”);
if(www.error != null){
var bytes = www.bytes;
}
AssetBundle ab = www.assetBundle;
GameObject gameObject = ab.mainAsset as GameObject;
Instantiate(gameObject);
Debug.Log(“5”);
Debug.Log(“load local assetBundle finished…”+gameObject);
}
}
注意:
大概执行流程,点击按钮后开始执行协同程序,WWW按照提供的url进行加载,完毕后 yield return www;中断指令跳转到主线程。
主线程继续执行其他内容,www在加载完成后跳出中断继续执行余下内容。
加载完毕,实例化加载内容。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,协程是一种特殊的函数,可以在一段时间内暂停执行,并在稍后继续执行。受伤击退协程是一种常见的应用场景,用于在游戏中模拟受伤后的击退效果。 通常情况下,受伤击退协程可以通过以下步骤实现: 1. 在受伤时,可以通过调用协程函数来启动受伤击退协程。例如,可以使用`StartCoroutine()`函数来启动协程。 2. 在协程函数中,可以使用`yield return`语句来暂停协程的执行,并指定一个时间间隔。例如,可以使用`yield return new WaitForSeconds(time)`来暂停协程的执行一段时间。 3. 在暂停期间,可以对受伤对象进行击退操作。可以通过修改对象的位置或者应用力来实现击退效果。 4. 在暂停时间结束后,协程会继续执行,可以在这里进行一些清理工作或者恢复对象的状态。 下面是一个简单的示例代码,演示了如何实现受伤击退协程: ```csharp using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public float knockbackForce = 10f; public float knockbackDuration = 0.5f; private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Enemy")) { StartCoroutine(KnockbackCoroutine()); } } IEnumerator KnockbackCoroutine() { // 施加击退力 rb.AddForce(Vector2.up * knockbackForce, ForceMode2D.Impulse); // 暂停协程执行一段时间 yield return new WaitForSeconds(knockbackDuration); // 恢复状态或进行清理工作 rb.velocity = Vector2.zero; } } ``` 这段代码中,当玩家与敌人碰撞时,会启动受伤击退协程。在协程中,首先施加一个向上的击退力,然后暂停协程执行一段时间(`knockbackDuration`),最后恢复玩家的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值