随手写的文字垃圾(),若有错误欢迎各位大佬指出
线程是什么应该不用讲了,不懂的给我去学操作系统!
Unity支持多线程,但是,主线程之外的线程无法访问Unity相关对象内容。
注意:Unity中多开的线程,要记得手动关闭
一般来说可以在OnDestroy生命周期函数中调用Thread的Abort方法然后将线程置空来关闭线程。
要这样做的原因是因为Unity本身也是一个软件,在编辑器模式下使用多线程,就算停止调试,Unity仍然在运行,所以不手动关闭的话线程不会停止。
由于副线程无法访问Unity对象,所以在其中一般进行的是计算或者接收消息之类的操作,然后把结果放置到可访问的公共容器供主线程使用。合理使用多线程可以避免主线程的卡顿。(但是不做网络相关功能的话用的很少)
由此可以引出协程。
协程允许我们在代码中创建、执行和管理延迟执行的任务。使用协程可以方便地实现复杂的异步操作、动画效果、定时器、状态机等,而无需使用传统的多线程技术。
申明协程函数:
Unity中,协程函数返回值必须是 IEnumerator
,函数中使用yield return进行返回。
开启协程函数:
不能直接调用,通过Unity提供的StartCoroutine()方法来开启协程函数,参数是一个IEnumerator类的示例,一般来说就是你申明的协程函数。
例:
using UnityEngine;
using System.Collections;
public class CoroutineExample : MonoBehaviour
{
void Start()
{
StartCoroutine(MyCoroutine());
}
IEnumerator MyCoroutine()
{
Debug.Log("协程开始执行");
// 等待1秒钟
yield return new WaitForSeconds(1f);
Debug.Log("1秒钟后执行的操作");
// 等待2秒钟
yield return new WaitForSeconds(2f);
Debug.Log("又过了2秒钟后执行的操作");
// 等待帧结束
yield return null;
Debug.Log("等待当前帧结束后执行的操作");
// 无限循环
while (true)
{
Debug.Log("协程持续运行中...");
yield return new WaitForSeconds(3f);
}
}
}
关闭协程:
StopAllCoroutines()关闭所有协程;StopCoroutine()
停止一个正在运行的协程。