Unity客户端通信测试问题处理(一)

在测试Unity客户端通信模块时,遇到API只能在主线程调用的问题。由于在监听线程中解析消息,导致调用MonoBehaviour的比较操作时出现错误。通过使用.NET的Object.ReferenceEquals函数替代 Operate == 解决了此问题。同时,在Awake函数中初始化单例,以避免线程限制。后续还有因主线程限制需要调整的地方。
摘要由CSDN通过智能技术生成

Unity客户端通信测试问题处理(一)


        最近在测试程序的通信模块时,遇到了一个问题:Unity的API函数只能在主线程中调用,而作为客户端程序,我单独启用了一个监听线程来接收服务端发送的消息,消息接收后的解析函数也由该线程一并调用。那么问题来了,在解析函数之中,我将不能调用Unity的任何API函数。


           之前因为没有意识到这个问题,许多处理都是直接放在消息解析函数中做的,程序一经测试首先就报出了以下错误:     

          

           CompareBaseObjectsInternalcan only be called from the main thread…


           看到这条信息,自己寻思是怎么回事,像是对象的比较判断上出了问题,于是开始查看代码。后来发现是因为在解析函数中,收到消息后调用了一个管理者类中的方法,这个管理者类使用单例模式实现,并且继承了MonoBehaviour类。在获取单例对象时,涉及了对象的判空操作,代码如下所示:

 

           if ( null ==_uniqueInstance ){...}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问。通过 Unity 实现 UDP 通信需要使用 Unity 的网络组件。以下是实现简单客户端和服务器之间 UDP 通信的基本步骤: 1. 创建一个空的Unity项目。 2. 在Unity项目中创建一个 GameObject,名为UDPTest。 3. 添加一个 C# 脚本文件,名为UDPTest.cs。 4. 使用以下代码设置脚本: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; public class UDPTest : MonoBehaviour { // 服务器 IP 地址和端口号 public string serverIp = "127.0.0.1"; public int serverPort = 8888; // 本地 IP 地址和端口号 public string localIp = "127.0.0.1"; public int localPort = 7777; private UdpClient udpClient; private IPEndPoint serverEndPoint; private Thread receiveThread; private bool isRunning = false; void Start() { udpClient = new UdpClient(); serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), serverPort); udpClient.Connect(serverEndPoint); receiveThread = new Thread(new ThreadStart(ReceiveData)); receiveThread.Start(); isRunning = true; } void OnApplicationQuit() { isRunning = false; if (receiveThread != null) { receiveThread.Join(); } udpClient.Close(); } void ReceiveData() { while (isRunning) { try { IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] data = udpClient.Receive(ref remoteEndPoint); string message = System.Text.Encoding.UTF8.GetString(data); Debug.Log("Received message: " + message); } catch (Exception ex) { Debug.LogError(ex.Message); } } } void Update() { if (isRunning) { string message = "Hello, World!"; byte[] data = System.Text.Encoding.UTF8.GetBytes(message); try { udpClient.Send(data, data.Length); } catch (Exception ex) { Debug.LogError(ex.Message); } } } } ``` 5. 将脚本Drag&Drop到UDPTest GameObject上。 6. 在 Inspector 面板上设置 IP 地址和端口号(如果您想在同一台计算机上测试,则可以使用 127.0.0.1)。 7. 单击播放按钮来运行项目。您应该会看到控制台输出上面的"Hello, World!"信息。 注意:此脚本仅实现了最基本的 UDP 通信,并不能应对复杂的情况。在实际项目中应对数据进行加密、压缩和校验等处理操作,以确保数据传输的安全和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值