我有一个需要侦听服务器消息的客户端脚本。事情的服务器端似乎工作正常,但由于我对网络非常陌生,所以我仍然试图将事情整理在一起。我正在使用Unity的NetworkTransport API进行配置和连接。卡住的地方是如何正确创建我的客户端注册处理程序以从服务器接收传入消息类型。设置RegisterHandler的正确方法
从服务器上,我通过发送:
public void SendTexture(Texture2D tex, string type, int id, int strength, int hitpoints)
{
TextureMessage msg = new TextureMessage();
//Convert Texture2D to byte array
msg.Tex = tex.GetRawTextureData();
msg.Type = type;
msg.Id = id;
msg.Strength = strength;
msg.Hitpoints = hitpoints;
NetworkServer.SendToAll(MyMsgType.texture, msg);
}
但我不能确定如何构建事物的接收端在客户端上。我得到的最远的是这一点,但我已经破事:
public void setupRegisterHandler()
{
//Register to texture receive event
NetworkClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);
}
public void OnTextureReceive(NetworkMessage netMsg)
{
TextureMessage msg = netMsg.ReadMessage<TextureMessage>();
string type = msg.Type;
Debug.Log("Type : " + type);
int id = msg.Id;
Debug.Log("ID : " + id);
int strength = msg.Strength;
Debug.Log("Strength : " + strength);
int hitpoints = msg.Hitpoints;
Debug.Log("Hit Points : " + hitpoints);
//Your Received Texture2D
Texture2D receivedtexture = new Texture2D(1280, 1024);
receivedtexture.LoadRawTextureData(msg.Tex);
receivedtexture.Apply();
}
从线NetworkClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);
,我发现了错误'Assets/Scripts/Client.cs(106,17): error CS0120: An object reference is required to access non-static member 'UnityEngine.Networking.NetworkClient.RegisterHandler(short, UnityEngine.Networking.NetworkMessageDelegate)'
如何设置我的setupRegisterHandler()函数是否正确?近一个月来我一直在网络上苦苦挣扎,我感觉我好像很亲密!如果您需要它们,我还包括下面的完整脚本以供参考。谢谢!
客户端脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class Client : MonoBehaviour {
private const int MAX_CONNECTION = 100;
private string serverIP = "127.0.0.1";
private int port = 5701;
private int hostId;
private int webHostId;
private int reliableChannel;
private int reliableSeqChannel;
private int reliableFragChannel;
private int unreliableChannel;
private int unreliableSeqChannel;
private int ourClientId;
private string playerName;
private int connectionId;
private float connectionTime;
private bool isStarted = false;
private bool isConnected = false;
private byte error;
private GameObject infoDisplayText;
private void Awake()
{
infoDisplayText = GameObject.Find("InfoDisplay");
}
private void Start()
{
Connect();
}
private void Connect()
{
NetworkTransport.Init();
ConnectionConfig cc = new ConnectionConfig();
reliableChannel = cc.AddChannel(QosType.Reliable);
reliableSeqChannel = cc.AddChannel(QosType.ReliableSequenced);
reliableFragChannel = cc.AddChannel(QosType.ReliableFragmented);
unreliableChannel = cc.AddChannel(QosType.Unreliable);
unreliableSeqChannel = cc.AddChannel(QosType.UnreliableSequenced);
cc.PacketSize = 1024;
HostTopology topo = new HostTopology(cc, MAX_CONNECTION);
hostId = NetworkTransport.AddHost(topo, 0);
// Run client/server on different machines
//hostID = NetworkTransport.AddHost(topo, port, null);
connectionId = NetworkTransport.Connect(hostId, serverIP, port, 0, out error);
infoDisplayText.GetComponent<Text>().text += playerName + " connected.\n";
connectionTime = Time.time;
isConnected = true;
setupRegisterHandler();
}
private void Update()
{
if (!isConnected)
return;
int recHostId;
int connectionId;
int channelId;
byte[] recBuffer = new byte[1024];
int bufferSize = 1024;
int dataSize;
byte error;
NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
switch (recData)
{
case NetworkEventType.ConnectEvent:
Debug.Log("Player " + connectionId + " has connected");
infoDisplayText.GetComponent<Text>().text += "Player " + connectionId + " has connected\n";
break;
case NetworkEventType.DataEvent:
break;
case NetworkEventType.DisconnectEvent:
break;
}
}
public void setupRegisterHandler()
{
//Register to texture receive event
NetworkClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);
}
//Called when texture is received
public void OnTextureReceive(NetworkMessage netMsg)
{
TextureMessage msg = netMsg.ReadMessage<TextureMessage>();
//Your Received message
string message = msg.Type;
Debug.Log("Texture Messsage " + message);
//Your Received Texture2D
Texture2D receivedtexture = new Texture2D(1280, 1024);
receivedtexture.LoadRawTextureData(msg.Tex);
receivedtexture.Apply();
}
}
服务器脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class Server : MonoBehaviour
{
public Texture2D texToSend;
string typeToSend = "Deer";
int idToSend = 1;
int strengthToSend = 80;
int hitPointsToSend = 2;
private const int MAX_CONNECTION = 100;
private int port = 5701;
private int hostId;
private int webHostId;
private int reliableChannel;
private int reliableSeqChannel;
private int reliableFragChannel;
private int unreliableChannel;
private int unreliableSeqChannel;
private bool isStarted = false;
private byte error;
private GameObject infoDisplayText;
private void Awake()
{
infoDisplayText = GameObject.Find("InfoDisplay");
}
private void Start()
{
NetworkTransport.Init();
ConnectionConfig cc = new ConnectionConfig();
reliableChannel = cc.AddChannel(QosType.Reliable);
reliableSeqChannel = cc.AddChannel(QosType.ReliableSequenced);
reliableFragChannel = cc.AddChannel(QosType.ReliableFragmented);
unreliableChannel = cc.AddChannel(QosType.Unreliable);
unreliableSeqChannel = cc.AddChannel(QosType.UnreliableSequenced);
cc.PacketSize = 1024;
HostTopology topo = new HostTopology(cc, MAX_CONNECTION);
hostId = NetworkTransport.AddHost(topo, port, null);
if (NetworkTransport.IsStarted)
{
isStarted = true;
Debug.Log("NetworkTransport is Started.");
infoDisplayText.GetComponent<Text>().text += "NetworkTransport is Started.\n";
}
Debug.Log("Server Started.");
infoDisplayText.GetComponent<Text>().text += "Server Started.\n";
}
private void Update()
{
if (!isStarted)
return;
int recHostId;
int connectionId;
int channelId;
byte[] recBuffer = new byte[1024];
int bufferSize = 1024;
int dataSize;
byte error;
NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
switch (recData)
{
case NetworkEventType.ConnectEvent:
Debug.Log("Player " + connectionId + " has connected");
infoDisplayText.GetComponent<Text>().text += "Player " + connectionId + " has connected\n";
break;
case NetworkEventType.DataEvent:
break;
case NetworkEventType.DisconnectEvent:
break;
}
}
public void SendOnButtonPress()
{
SendTexture(texToSend, typeToSend, idToSend, strengthToSend, hitPointsToSend);
}
//Call to send the Texture and a simple string message
public void SendTexture(Texture2D tex, string type, int id, int strength, int hitpoints)
{
TextureMessage msg = new TextureMessage();
//Convert Texture2D to byte array
msg.Tex = tex.GetRawTextureData();
msg.Type = type;
msg.Id = id;
msg.Strength = strength;
msg.Hitpoints = hitpoints;
NetworkServer.SendToAll(MyMsgType.texture, msg);
Debug.Log("Message of texture size of " + msg.Tex.Length + ", string size of " + msg.Type.Length + ", id of " + msg.Id + ", strength of " + msg.Strength + ", and hit points of " + msg.Hitpoints + " was sent!");
infoDisplayText.GetComponent<Text>().text += "Message of texture size of " + msg.Tex.Length + ", string size of " + msg.Type.Length + ", id of " + msg.Id + ", strength of " + msg.Strength + ", and hit points of " + msg.Hitpoints + " was sent!\n";
}
}