2

我在 unity3d 控制台中收到这样的错误:

INTERNAL_CALL_Internal_InstantiateSingle 只能从主线程调用。加载场景时,构造函数和字段初始化程序将从加载线程中执行。不要在构造函数或字段初始化程序中使用此函数,而是将初始化代码移至 Awake 或 Start 函数。

我正在尝试的是执行方法,它似乎在主线程中定义,如“Instantiate()”

如何调用此方法或调用主线程来执行它?

编辑

protected static void processCommand(String data) {
    ...
    } else if(data.StartsWith("LOGGEDIN")) {
        ...
        Vector3 pos = new Vector3(0, 1.2F, 0);
        Quaternion rot = Quaternion.identity;
        myModel = (GameObject)Instantiate(player, pos, rot);
...

线程是:

Thread tidListen = new Thread(new ThreadStart(ListenThread));
tidListen.Start();

private static void ListenThread() {
        while(connected) {
            int lData = myStream.Read(myBuffer, 0, client.ReceiveBufferSize);
            String myString = Encoding.ASCII.GetString(myBuffer);
            myString = myString.Substring(0, lData);
            processCommand(myString);
        }
    }

当我调用 processCommand 时,我有方法: Instantiate()

编辑 2

我也试过这个Link,当我从 currentThread 获得 ManagedThreadId 时,我得到 1 (这似乎是主线程),但我再次得到同样的错误。

4

2 回答 2

0

为了跳过这个,我为来自服务器的消息实现了一个队列系统。

于 2013-01-01T17:19:21.950 回答
-3

Instantiate(), 像StartCoroutine(), 只能从 Unity 托管内存中的对象调用 - 即场景内 GameObjects 上的 MonoBehaviours。

我相信您protected static void processCommand(String data)无法调用GameObject.Instantiate(),因为processCommand()不在场景中存在的对象上(因此继承自 MonoBehaviour)。我认为这是因为静态方法(对象)不能作为场景中的实例存在。

尝试制作一个挂在场景中并Instantiate()为您调用的“实例化器”对象。

于 2013-01-08T00:57:18.720 回答