在具有单位的函数中实例化预制件

时间:2016-04-13 09:23:48

标签: c# unity3d thread-safety unityscript unity5

我正在尝试在我的场景中实例化一些预制件,我被迫在一个函数(不是主线程)中执行它,因为我只在我收到一些预制件时才实例化数据通过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 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.

即使很多人遇到过这个问题,我找不到一个允许我在函数中实例化预制件的解决方案。

1 个答案:

答案 0 :(得分:3)

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

我想如果你还在等待,那么1帧延迟并不重要。