我在unity3d控制台中收到这样的错误:
INTERNAL_CALL_Internal_InstantiateSingle只能从主线程调用。 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到唤醒或启动函数。
我正在尝试的是执行方法,它似乎在主线程中定义,如“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(这似乎是主线程),但我又得到了同样的错误。
答案 0 :(得分:1)
要跳过这个,我为来自服务器的消息实现了一个队列系统。
答案 1 :(得分:-2)
Instantiate()
与StartCoroutine()
一样,只能从Unity管理内存中的对象调用 - 即场景游戏对象中的MonoBehaviours。
我相信您的protected static void processCommand(String data)
无法调用GameObject.Instantiate()
,因为processCommand()
不在场景中存在的对象上(因此继承自MonoBehaviour)。我认为这是因为静态方法(对象)不能作为场景中的实例存在。
尝试制作一个在场景中挂起的“实例化”对象,然后为Instantiate()
调用。