繁体   English   中英

C#/ Unity3D-从不同的函数调用时,函数无法以相同的方式工作

[英]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!");

此行下面的所有内容似乎都无法正常运行,也不会引发任何错误。 您有什么线索为什么会发生此问题,如何解决?

函数OnIncomingDataUDPReceive都在同一类中。

我不确定为什么UDP版本不起作用,但是我可以阐明为什么某些代码部分没有运行。

Unity具有您可以考虑的“有用”功能,该功能在每次执行遇到错误时都会以其他方式结束程序,它将结束当前指令集并在下一个可能的点继续执行,而不会向控制台提供任何错误。 至于为什么他们没有提供错误,我无法告诉您,但他们没有提供。

因此,就您的程序而言,代码可能会崩溃:

GameObject startPoint = GameObject.Find("CharactersOnline/" + characterId.ToString());

尝试获取GameObject时。 在这种情况下,您的代码崩溃,Unity结束执行,然后继续运行它可以从Monobehavior类运行的下一个可能的事物,同时假装没有任何问题。

我建议解决此问题的方法是将其放入try / catch块中,并在失败时打印。 假设我是对的,那您应该能够看到此时打印的消息,并根据当时可以访问的数据开始调试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM