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()、 likeStartCoroutine()は、Unity のマネージド メモリ内にあるオブジェクトからのみ呼び出すことができます。つまり、シーン内ゲームオブジェクトの MonoBehaviour です。

シーン内に存在するオブジェクト上にない (したがって、MonoBehaviour から継承する) ため、protected static void processCommand(String data)呼び出すGameObject.Instantiate()ことができないと思います。processCommand()これは、静的メソッド (オブジェクト) がシーン内のインスタンスとして存在できないためだと思います。

Instantiate()シーンにぶら下がって呼び出しを行う「インスタンス化」オブジェクトを作成してみてください。

于 2013-01-08T00:57:18.720 に答える