回调未在Unity插件中的c#脚本中发射



我有一个我试图放入Unity插件的C#脚本。

本质上,该脚本只是创建套接字连接,摄入数据并解析它。当仅用作Unity的"独立"脚本时,它可以很好地工作。

这是脚本的代码:

using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Linq;
public class ClientSocket
{
    private Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    private byte[] _recieveBuffer = new byte[8142];
    void Start()
    {
        SetupServer();
    }
    void Update()
    {
    }
    void OnApplicationQuit()
    {
        _clientSocket.Close();
    }
    private void SetupServer()
    {
        try
        {
            _clientSocket.Connect("127.0.0.1", 12345);
        }
        catch (SocketException ex)
        {
            Debug.Log(ex.Message);
        }
        _clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    private void ReceiveCallback(IAsyncResult AR)
    {
        //Check how much bytes are recieved and call EndRecieve to finalize handshake
        int recieved = _clientSocket.EndReceive(AR);
        if (recieved <= 0)
            return;
        //Copy the recieved data into new buffer, to avoid null bytes
        byte[] recData = new byte[recieved];
        Buffer.BlockCopy(_recieveBuffer, 0, recData, 0, recieved);
        string incomingData = System.Text.Encoding.Default.GetString(_recieveBuffer);
        Debug.Log(incomingData);            
    }
}

正如我提到的那样,当作为脚本时,这很棒 - 创建连接,而我的ReceiveCallback触发,并从套接字连接接收数据。

现在,当我尝试在Unity插件中使用基本相同的代码时,连接会创建;但是回调永远不会发射……关于为什么这可能会有所不同的茫然。任何想法或指示都赞赏!

这是用于插件中的稍微修改的版本:

using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Linq;
namespace InputsPlugin
{
    public class ClientSocket
    {
        private Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private byte[] _recieveBuffer = new byte[8142];
        public void StartConnection()
        {
            SetupServer();
        }
        private void SetupServer()
        {
            try
            {
                _clientSocket.Connect("127.0.0.1", 12345);
                Debug.Log("Connected!!!!");
            }
            catch (SocketException ex)
            {
                Debug.Log(ex.Message);
            }
            Debug.Log("Callback?");
            _clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
            Debug.Log("Callback?");
        }
        private void ReceiveCallback(IAsyncResult AR)
        {
            Debug.Log("Callback!!!!");
            //Check how much bytes are recieved and call EndRecieve to finalize handshake
            int recieved = _clientSocket.EndReceive(AR);
            Debug.Log(recieved);
            if (recieved <= 0)
                return;
            //Copy the recieved data into new buffer, to avoid null bytes
            byte[] recData = new byte[recieved];
            Buffer.BlockCopy(_recieveBuffer, 0, recData, 0, recieved);
            string incomingData = System.Text.Encoding.Default.GetString(_recieveBuffer);
            Debug.Log(incomingData);
            //Start receiving again
            _clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
        private void SendData(byte[] data)
        {
            SocketAsyncEventArgs socketAsyncData = new SocketAsyncEventArgs();
            socketAsyncData.SetBuffer(data, 0, data.Length);
            _clientSocket.SendAsync(socketAsyncData);
        }
    }
}

您的启动方法很可能会转换为构造函数,因为它不再由发动机调用。作为一种私人方法,它不能从外部调用。

因此,您的设置服务器可能永远不会被调用。

您还可以删除更新,onApplicationQuit应该是驱动器或某些清洁方法。

最新更新