unity使用多线程或异步Demo

unity使用多线程或异步Demo,第1张

不只Unity,大多数游戏引擎都是单线程的,因为大多数引擎都是主循环结构,逻辑更新和画面更新的时间点要求有确定性,如果在逻辑更新和画面更新中引入多线程,就需要做同步而这加大了游戏性程序员(编程关卡的程序员)的开发难度。所以需要异步功能的时候,游戏引擎总是倾向于使用time slicing的策略而不是使用多线程,Unity中的协程(coroutine)yield语法本质就是time slicing。但是多线程也是有好处的,如果不是画面更新,也不是常规的逻辑更新(指包括AI、物理碰撞、角色控制这些),而是一些其他后台任务,比如网络传输,则可以将这个独立出来做成一个工作线程,这需要写Unity游戏的Native扩展。

using UnityEngine

using System.Collections

using UnityEngine.UI

using UnityEngine.SceneManagement

/// <summary>

/// 挂载到camera上 异步加载

/// </summary>

public class ARLoadingScr : MonoBehaviour

{

/// <summary>

/// 滑动条提交回答

/// </summary>

public Slider processBar

private AsyncOperation async

private int nowProcess

void Start()

{

StartCoroutine(loadScene())

}

/// <summary>

/// 加载完场景后就会跳转

/// </summary>

/// <returns></returns>

IEnumerator loadScene()

{

async = SceneManager.LoadSceneAsync("AR")

async.allowSceneActivation = false

yield return async

}

void Update()

{

if (async == null)

{

return

}

int toProcess

// async.progress 你正在读取的场景的进度值 0---0.9

// 如果当前的进度小于0.9,说明它还没有加载完成,就说明进度条还需要移动

// 如果,场景的数据加载完毕,async.progress 的值就会等于0.9

if (async.progress <0.9f)

{

toProcess = (int)async.progress * 100

}

else

{

toProcess = 100

}

// 如果滑动条的当前进度,小于,当前加载场景的方法返回的进度

if (nowProcess <toProcess)

{

nowProcess++

}

processBar.value = nowProcess / 100f

// 设置为true的时候,如果场景数据加载完毕,就可以自动跳转场景

if (nowProcess == 100)

{

async.allowSceneActivation = true

}

}

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/495951.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-15
下一篇2023-06-15

发表评论

登录后才能评论

评论列表(0条)

    保存