博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity3d 协程的注意问题(新手须注意,老手须加勉)
阅读量:5327 次
发布时间:2019-06-14

本文共 1053 字,大约阅读时间需要 3 分钟。

关于unity3d的协程,非常的好用,比如等待几秒执行,等待下一帧执行等!

但是也有潜在的问题:

1.协程是单线程的,在主线程中完成

2.如果发现yield, 那么这一帧会结束,那么等下一帧调用此脚本的时候继续执行!

如果同一个协程方法被两个方法在相对短的时间内都进行调用,那么就会出现逻辑上的错误!这个时候需要用锁来锁定!

我举例如下:

using UnityEngine;

using System.Collections;

public class YieldScpipt : MonoBehaviour {

    // Use this for initialization

    void Start () {
    }
    // Update is called once per frame
    void Update () {
    }

    public void RunContinue()

    {
        StartCoroutine(run());
    }

    IEnumerator run()

    {
        print("1");
        //yield return 0;
        print("2");
        //yield return 0;
        print("3");
        yield return 0;
    }
}

在另一个类中用Test方法进行调用

public class Test : MonoBehaviour {

    public YieldScpipt ys;

    // Use this for initialization
    void Start () {
     for(int i=0;i<3;i++)
     {
         ys.RunContinue();
     }
    }
    // Update is called once per frame
    void Update () {
    }
}

那么会打印如下:1,2,3,1,2,3.。。。预期的顺序

如果把注释去掉

  IEnumerator run()

    {
        print("1");
        yield return 0;
        print("2");
        yield return 0;
        print("3");
        yield return 0;
    }
那么打印的顺序就不能保证了,这就是我遇到的问题!

当然,我不是用for循环这样引起的,我是不经意间写错了逻辑,导致在很短的时间内,这个方法被两次或者多次调用,导致了逻辑错误!

有什么问题请指出!欢迎与广州老龙联系!

转载于:https://www.cnblogs.com/alongu3d/p/5318189.html

你可能感兴趣的文章
CBMVC For Titanium Alloy 发布!
查看>>
docker镜像的常用操作
查看>>
CSS3实现的几个小loading效果
查看>>
PROE工程图
查看>>
博客园真好啊!
查看>>
js 绑定数据 实现分页查询
查看>>
磁盘驱动器号的修改恢复
查看>>
Swift 可选(Optionals)类型
查看>>
单表查询
查看>>
Node.js入门:文件查找机制
查看>>
C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符
查看>>
[Luogu] 被污染的河流
查看>>
[LeetCode] Remove Duplicates from Sorted List 移除有序链表中的重复项
查看>>
[LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变
查看>>
[CareerCup] 17.1 Swap Number In Place 互换位置
查看>>
[LintCode] Swap Nodes in Pairs 成对交换节点
查看>>
[LintCode] Backpack VI 背包之六
查看>>
[LeetCode] Redundant Connection 冗余的连接
查看>>
2015/6/9 站立会议以及索引卡更新
查看>>
iptables 端口转发--内网实现上网
查看>>