[英]C#/Unity3D - Function not working in the same way when called from different functions
我将Unity 3D用作使用TCP和UDP套接字的C#应用程序的客户端。
这是一个函数:
public void updateCharacterPosition(CharacterPosition position, int characterId, int cnnId)
{
if (Character.SceneLoaded != true)
return;
if (cnnId != ClientWorldServer.connectionId)
{
Debug.Log("HERE!");
GameObject startPoint = GameObject.Find("CharactersOnline/" + characterId.ToString());
Debug.Log("HERE 1: " + GameObject.Find("CharactersOnline").transform.name);
Debug.Log("HERE 2: " + startPoint.transform.name);
GameObject endPoint = new GameObject();
endPoint.transform.position = new Vector3(position.x, position.y, position.z);
GameObject.Find("CharactersOnline/" + characterId.ToString()).transform.position = Vector3.Lerp(startPoint.transform.position, endPoint.transform.position, Time.deltaTime);
//Updating Clients ram of the character's position
Character.characterDetails[characterId].characterPosition.x = position.x;
Character.characterDetails[characterId].characterPosition.y = position.y;
Character.characterDetails[characterId].characterPosition.z = position.z;
//Destroy(endPoint);
}
}
这是两个正在调用此函数的函数:
接收TCP数据的功能:
private void OnIncomingData(string data)
{
JsonData json = JsonConvert.DeserializeObject<JsonData>(data);
string prefix = json.header.Substring(0, 2);
if (prefix != "0x")
{
Debug.Log("Unknown packet: " + data + "\n");
}
else
{
string header = json.header.Substring(2);
int conId = json.connectionId;
//Debug.Log("Header:" + header);
switch (header)
{
default:
Debug.Log("Unknown packet: " + data + "\n");
break;
case "000":
Debug.Log("Empty header received: " + json.header + "\n");
break;
case "001":
if (connectionId == 0)
{
connectionId = conId;
Debug.Log("Connection ID: " + connectionId + "\n");
//After we have connected to TCP Stream now let's connect to UDP.
ConnectUDP();
}
break;
case "004":
DisplayCharacterSelects(json.data, connectionId);
break;
case "005":
CharacterData charData = new CharacterData();
string jsonData = JsonConvert.SerializeObject(json.data, Formatting.None);
charData = JsonConvert.DeserializeObject<CharacterData>(jsonData);
playerSpawner.SpawnPlayer(playerSpawner,charData);
break;
case "006":
playerSpawner.SpawnOnlinePlayers(playerSpawner,json.data);
break;
case "007":
CharacterLogout(json.data);
break;
case "008":
CharacterPosition position = new CharacterPosition();
position.x = float.Parse(json.data["position.x"].ToString());
position.y = float.Parse(json.data["position.y"].ToString());
position.z = float.Parse(json.data["position.z"].ToString());
character.updateCharacterPosition(position, Convert.ToInt32(json.data["characterId"].ToString()), conId);
break;
case "009":
character.updateCharacterRotation(json.data, conId);
break;
}
Debug.Log("World Server: " + data + " TIME: " + Timer);
}
}
这是接收UDP数据的函数:
private void UDPReceive()
{
_socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
{
State so = (State)ar.AsyncState;
int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
_socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
Debug.Log("UDP World: " + Encoding.ASCII.GetString(so.buffer, 0, bytes));
string receivedData = Encoding.ASCII.GetString(so.buffer, 0, bytes);
JsonData json = JsonConvert.DeserializeObject<JsonData>(receivedData);
string prefix = json.header.Substring(0, 2);
if (prefix != "3x")
{
Debug.Log("Unknown packet: " + receivedData + "\n");
}
else
{
string header = json.header.Substring(2);
int conId = json.connectionId;
//Debug.Log("Header:" + header);
switch (header)
{
default:
Debug.Log("Unknown packet: " + receivedData + "\n");
break;
case "001":
Debug.Log("Data received: " + receivedData + "\n");
break;
case "002":
CharacterPosition position = new CharacterPosition();
position.x = float.Parse(json.data["position.x"].ToString());
position.y = float.Parse(json.data["position.y"].ToString());
position.z = float.Parse(json.data["position.z"].ToString());
character.updateCharacterPosition(position, Convert.ToInt32(json.data["characterId"].ToString()), conId);
break;
case "003":
character.updateCharacterRotation(json.data, conId);
break;
}
}
}, state);
}
怎么了。 当从作为TCP侦听器的OnIncomingData
调用updateCharacterPosition()
,该功能按预期100%工作。
然而,当函数updateCharacterPosition()
是从称为UDPReceive()
函数updateCharacterPosition()
好像正在停止它的执行在GameObject startPoint = GameObject.Find("CharactersOnline/" + characterId.ToString());
线路:
Debug.Log("HERE 1: " + GameObject.Find("CharactersOnline").transform.name);
Debug.Log("HERE 2: " + startPoint.transform.name);
没有显示任何结果。 好像他们不在那里。 Unity控制台中未显示任何错误,就像找不到对象或其他东西一样,但是Debug.Log
仍未显示任何内容。 您在控制台中唯一看到的是以下行:
Debug.Log("HERE!");
此行下面的所有内容似乎都无法正常运行,也不会引发任何错误。 您有什么线索为什么会发生此问题,如何解决?
函数OnIncomingData
和UDPReceive
都在同一类中。
我不确定为什么UDP版本不起作用,但是我可以阐明为什么某些代码部分没有运行。
Unity具有您可以考虑的“有用”功能,该功能在每次执行遇到错误时都会以其他方式结束程序,它将结束当前指令集并在下一个可能的点继续执行,而不会向控制台提供任何错误。 至于为什么他们没有提供错误,我无法告诉您,但他们没有提供。
因此,就您的程序而言,代码可能会崩溃:
GameObject startPoint = GameObject.Find("CharactersOnline/" + characterId.ToString());
尝试获取GameObject时。 在这种情况下,您的代码崩溃,Unity结束执行,然后继续运行它可以从Monobehavior类运行的下一个可能的事物,同时假装没有任何问题。
我建议解决此问题的方法是将其放入try / catch块中,并在失败时打印。 假设我是对的,那您应该能够看到此时打印的消息,并根据当时可以访问的数据开始调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.