gpt4 book ai didi

c# - 在 Unity 中使用异步等待

转载 作者:行者123 更新时间:2023-12-05 07:01:25 32 4
gpt4 key购买 nike

有人能说说这样的建筑是怎么做的吗?当前返回 UnityExtension。好吧,或者建议将非 MonoBehaviour 代码的一部分移动到单独的线程中是多么容易。

UnityException: get_canAccess can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

    private async void Awake()
{
Mesh protoMesh = gameObject.GetComponent<MeshFilter>().mesh;
SelfMesh = await InitMeshAsync(protoMesh);
}

protected async Task<CustomMesh> InitMeshAsync(Mesh protoMesh)
{
return await Task.Run(() => new CustomMesh(protoMesh.vertices, protoMesh.triangles));
}

最佳答案

通过查看异常,CustomMesh 使用的代码无法从单独的线程运行。 protoMesh.vertices, protoMesh.triangles 需要在开始新线程之前获取。

private async void Awake()
{
Mesh protoMesh = gameObject.GetComponent<MeshFilter>().mesh;
SelfMesh = await InitMeshAsync(protoMesh);
}

protected async Task<CustomMesh> InitMeshAsync(Mesh protoMesh)
{
var vertices = protoMesh.vertices;
var triangles = protoMesh.triangles;
return await Task.Run(() => new CustomMesh(vertices, triangles));
}

因为什么可以从单独的线程运行,什么不能从一个单独的线程运行,这很棘手,你需要不断地查看给定的字段/方法是如何实现的,但一个好的经验法则是始终复制基类型的请求字段像 int, string, float[] before 你开始另一个线程。

如果你愿意去 GitHub您会看到 vertices 使用 GetAllocArrayFromChannel,它使用 GetAllocArrayFromChannelImpl,这是不能从单独线程使用的 native 方法。

关于c# - 在 Unity 中使用异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63846965/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com