C# 用unity实例化函数中的预置

C# 用unity实例化函数中的预置,c#,unity3d,thread-safety,unityscript,unity5,C#,Unity3d,Thread Safety,Unityscript,Unity5,我试图实例化场景中的一些预置,我被迫在函数(而不是主线程)中执行,因为我只有在通过TCP协议收到一些数据时才实例化预置 现在,我只是用一个立方体预制件进行测试,但它不起作用: private void addAircraft(Plane plane) { listPlane.Add(plane); //THIS 2 LINES ARE THE PROBLEM GameObject cube = Instantiate(Resour

我试图实例化场景中的一些预置,我被迫在函数(而不是主线程)中执行,因为我只有在通过TCP协议收到一些数据时才实例化预置

现在,我只是用一个立方体预制件进行测试,但它不起作用:

     private void addAircraft(Plane plane)
    {
        listPlane.Add(plane);
        //THIS 2 LINES ARE THE PROBLEM
        GameObject cube = Instantiate(Resources.Load("Cube", typeof(GameObject))) as GameObject;
        cube.transform.position = new Vector3((float)plane.X, 0, (float)plane.Y);
        //
        planeId_Object_Dictionnary.Add(plane.Flight, cube);
        Debug.Log("Plane " + plane.Flight + " is added");
    }
它返回给我错误

Load只能从主线程调用。
加载场景时,将从加载线程执行构造函数和字段初始值设定项。
不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到唤醒或启动函数。


即使很多人都遇到过这个问题,我也找不到一个解决方案,让我可以在函数中实例化我的预置。

你可以有一个私人布尔检查器,看看是否应该随时添加平面。当您收到TCP响应时,将其标记为true,从Update()函数调用addAircraft(),然后再次将其标记为false。Update()在主线程上运行,因此这将确保addAircrafter()也在主线程上运行


我想,如果你一直在等待,1帧延迟无关紧要。

你可以找一个私人的bool checker,看看是否应该在任何时候添加飞机。当您收到TCP响应时,将其标记为true,从Update()函数调用addAircraft(),然后再次将其标记为false。我想,如果您正在等待,则1帧延迟无关紧要+1。注意:这是一个高级主题。当然,他可以这样做,但这是不可靠的,因此,
Update
函数可能不知道布尔变量有时何时更改。将
boolean
变量声明为
volatile
或使用
lock
关键字是一种修复方法,强烈建议使用。