为了账号安全,请及时绑定邮箱和手机立即绑定

C#/Unity - 无法从异步方法调用 Unity 方法

C#/Unity - 无法从异步方法调用 Unity 方法

C#
喵喵时光机 2022-07-23 17:01:41
我正在使用 Unity3D。这是我的异步方法:private void Receive(IAsyncResult ar){    try    {        IPEndPoint ipEndPoint = null;        byte[] data = udpClient.EndReceive(ar, ref ipEndPoint);        string receivedMessage = Encoding.UTF8.GetString(data);        JsonData json = JsonConvert.DeserializeObject<JsonData>(receivedMessage);        string prefix = json.header.Substring(0, 2);        Debug.Log("UDP World: " + receivedMessage);        if (prefix != "3x")        {            Debug.Log("Unknown packet: " + receivedMessage + "\n");        }        else        {            string header = json.header.Substring(2);            int conId = json.connectionId;            switch (header)            {                default:                    Debug.Log("Unknown packet: " + receivedMessage + "\n");                    break;                case "001":                    Debug.Log("Data received: " + receivedMessage + "\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());            }        }    } 我在 Unity 控制台中看到的只是以下输出:Debug.Log("Position 2: X: " + position.x + " Y: " + position.y + " Z: " + position.z + " Character: " + characterId + " CnnID: " + cnnId);使用上面显示的 Debug.Log,我可以看到我拥有所需的所有信息。Debug.Log 中的所有内容都在那里。下一行:Debug.Log("GameObject FIND: " + GameObject.Find("CharactersOnline").name);似乎是一切刹车的地方。我没有从该行收到任何输出,也没有任何错误。它看起来就像它留在那里没有给出任何输出或错误。当updateCharacterPosition从另一个非异步方法调用时,内部的所有内容都updateCharacterPosition按缩进方式工作。知道为什么会发生这种奇怪的行为。我该如何解决这个问题,以便我可以调用updateCharacterPosition哪个ReceiveAsync 函数?
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

试试这个:/* 将它附加到场景中的任何对象上,以使其工作 */


using UnityEngine;

using System.Collections;

using System.Collections.Generic;


public class MainThread : MonoBehaviour {


   class CallInfo

   {

     public Function func;

     public object parameter;

     public CallInfo(Function Func, object Parameter)

     {

       func = Func;

       parameter = Parameter;

     }

     public void Execute()

     {

       func(parameter);

     }

   }


   public delegate void Function(object parameter);

   public delegate void Func();


   static List<CallInfo> calls = new List<CallInfo>();

   static List<Func> functions = new List<Func>();


   static Object callsLock = new Object();

   static Object functionsLock = new Object();


   void Start()

   {

     calls = new List<CallInfo>();

     functions = new List<Func>();


     StartCoroutine(Executer());

   }


   public static void Call(Function Func, object Parameter)

   {

     lock(callsLock)

     {

       calls.Add(new CallInfo(Func, Parameter));

     }

   }

   public static void Call(Func func)

   {

     lock(functionsLock)

     {

       functions.Add(func);

     }

   }


   IEnumerator Executer()

   {

     while(true)

     {

       yield return new WaitForSeconds(0.01f);


       while(calls.Count > 0)

       {

         calls[0].Execute();

         lock(callsLock)

         {

           calls.RemoveAt(0);

         }

       }


       while(functions.Count > 0)

       {

         functions[0]();

         lock(functionsLock)

         {

           functions.RemoveAt(0);

         }

       }

     }

   }

}

像这样打电话


MainThread.Call(YourFunction);

MainThread.Call(YourFunction, parameters);

我认为您的问题是您正在从另一个不允许的线程调用 Unity 方法


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号