我一直在努力解决这个问题,但现在我不知道出了什么问题。这是一段视频:https://www.youtube.com/watch?v=X8JrXwgvvFg正如您所看到的那样,我的播放器正在旋转并且已经同步(正如您可以通过播放器上方的文字看到的那样),但是"手"不是,我不知道为什么。你能救我吗?
Client.cs:
using System.Collections;
using System.Collections.Generic;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityStandardAssets.Characters.FirstPerson;
public class Player
{
public string playerName;
public GameObject avatar;
public int connectionID;
}
public class ClientManager : MonoBehaviour {
private const int MAX_PLAYERS = 24;
private int port = 5701;
private int hostId;
private int reliableChannel;
private int unreliableChannel;
private int clientID;
private int connectionId;
private float connectionTime;
private bool isConnected = false;
private bool isStarted = false;
private byte error;
private string playerName;
public GameObject playerPrefab;
public Dictionary<int, Player> players = new Dictionary<int, Player>();
public void Connect()
{
string pName = GameObject.Find("NameInput").GetComponent<InputField>().text;
if (pName == "")
{
Debug.LogError("You must type in your nickname before you connect!");
return;
}
playerName = pName;
NetworkTransport.Init();
ConnectionConfig cc = new ConnectionConfig();
reliableChannel = cc.AddChannel(QosType.Reliable);
unreliableChannel = cc.AddChannel(QosType.Unreliable);
HostTopology topo = new HostTopology(cc, MAX_PLAYERS);
hostId = NetworkTransport.AddHost(topo, 0);
connectionId = NetworkTransport.Connect(hostId, "127.0.0.1", port, 0, out error);
connectionTime = Time.time;
isConnected = true;
}
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.DataEvent:
string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);
Debug.Log("Receiving: " + msg);
string[] splitdata = msg.Split('|');
switch (splitdata[0])
{
case "ASKNAME":
OnAskName(splitdata);
break;
case "CNN":
Debug.LogError(splitdata[1] + " connected!");
SpawnPlayer(splitdata[1], int.Parse(splitdata[2]));
break;
case "DC":
Debug.LogError(splitdata[1] + " disconnected!");
PlayerDisconnected(int.Parse(splitdata[2]));
break;
case "ASKPOSITION":
OnAskPosition(splitdata);
break;
default:
Debug.LogError("Wrong message: " + msg);
break;
}
break;
}
}
private void OnAskPosition(string[] data)
{
if (!isStarted)
return;
//Update everyone else
for (int i = 1; i < data.Length; i++)
{
string[] d = data[i].Split('%');
//Prevent to server from updating us
if (clientID != int.Parse(d[0]))
{
Vector3 position = Vector3.zero;
position.x = float.Parse(d[1]);
position.y = float.Parse(d[2]);
position.z = float.Parse(d[3]);
players[int.Parse(d[0])].avatar.transform.position = position;
players[int.Parse(d[0])].avatar.transform.rotation = Quaternion.Euler(0, float.Parse(d[4]), 0);
players[int.Parse(d[0])].avatar.transform.GetChild(0).rotation = Quaternion.Euler(float.Parse(d[5]), 0, 0);
Debug.LogWarning("THEIR Player rot: " + float.Parse(d[4]));
Debug.LogWarning("THEIR Camera rot: " + float.Parse(d[5]));
}
}
//Send our own position
Vector3 myPosition = players[clientID].avatar.transform.position;
Debug.LogWarning("MY Player rot Y: " + players[clientID].avatar.transform.rotation.eulerAngles.y.ToString());
Debug.LogWarning("MY Cam rot X: " + players[clientID].avatar.transform.GetChild(0).rotation.eulerAngles.x.ToString());
string m = "MYPOSITION|" + myPosition.x.ToString() + '|' + myPosition.y.ToString() + '|' + myPosition.z.ToString() + '|' + players[clientID].avatar.transform.rotation.eulerAngles.y.ToString() + '|' + players[clientID].avatar.transform.GetChild(0).rotation.eulerAngles.x.ToString();
Send(m, unreliableChannel);
}
Server.cs
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class Players
{
public int connectionId;
public string playerName;
public Vector3 position;
public float rotationPlayerY;
public float rotationCameraX;
}
public class ServerManager : MonoBehaviour
{
private const int MAX_PLAYERS = 24;
private int port = 5701;
private int hostId;
private int reliableChannel;
private int unreliableChannel;
private bool isStarted = false;
private byte error;
private List<Players> players = new List<Players>();
private float lastmovementUpdate;
private float movementUpdateRate = 0.05f;
private void Start()
{
NetworkTransport.Init();
ConnectionConfig cc = new ConnectionConfig();
reliableChannel = cc.AddChannel(QosType.Reliable);
unreliableChannel = cc.AddChannel(QosType.Unreliable);
HostTopology topo = new HostTopology(cc, MAX_PLAYERS);
hostId = NetworkTransport.AddHost(topo, port, null);
isStarted = true;
}
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 + " connected!");
PlayerConnect(connectionId);
break;
case NetworkEventType.DataEvent:
string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);
Debug.Log("Receiving from " + connectionId + ": " + msg);
string[] splitdata = msg.Split('|');
switch (splitdata[0])
{
case "NAMEIS":
OnNameIs(connectionId, splitdata[1]);
break;
case "MYPOSITION":
OnMyPosition(connectionId, float.Parse(splitdata[1]), float.Parse(splitdata[2]), float.Parse(splitdata[3]));
OnMyRotation(connectionId, float.Parse(splitdata[4]), float.Parse(splitdata[5]));
break;
default:
Debug.LogError("Wrong message: " + msg);
break;
}
break;
case NetworkEventType.DisconnectEvent:
Debug.Log("Player " + connectionId + " disconnected!");
OnDisconnection(connectionId);
break;
}
//ask player for their position
if(Time.time - lastmovementUpdate > movementUpdateRate && players.Count > 0)
{
lastmovementUpdate = Time.time;
string m = "ASKPOSITION|";
foreach (Players pl in players)
{
//POSITION UPDATE
m += pl.connectionId.ToString() + '%' + pl.position.x.ToString() + '%' + pl.position.y.ToString() + '%' + pl.position.z.ToString() + '%' + pl.rotationPlayerY.ToString() + '%' + pl.rotationCameraX.ToString() + '|';
}
m = m.Trim('|');
Send(m, unreliableChannel, players);
}
}
private void OnMyPosition(int connID, float x, float y, float z)
{
players.Find(q => q.connectionId == connID).position = new Vector3(x, y, z);
}
private void OnMyRotation(int connID, float playerRot, float cameraRot)
{
players.Find(q => q.connectionId == connID).rotationCameraX = cameraRot;
players.Find(q => q.connectionId == connID).rotationPlayerY = playerRot;
}