Я пытаюсь сделать кооператив в своей игре. С помощью MasterServer, и Unity 2017.3.
Так вот мне необходимо понять как создать игрока со стороны сервера и клиента. Вот код который я использую для поднятия сервера:
Синтаксис:
Используется csharp
Network.InitializeServer(int.Parse(countPlayerGame.text), int.Parse(portGame.text), !Network.HavePublicAddress());
MasterServer.RegisterHost(gameTypeName, nameGame.text, commentGame.text);
SetupServer(int.Parse(portGame.text));
// Create a server and listen on a port
public void SetupServer(int port)
{
NetworkServer.Listen(port);
isAtStartup = false;
NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);
NetworkServer.RegisterHandler(MsgType.Disconnect, OnDisconnected);
NetworkServer.RegisterHandler(MsgType.Error, OnError);
SceneManager.LoadSceneAsync(scene);
}
MasterServer.RegisterHost(gameTypeName, nameGame.text, commentGame.text);
SetupServer(int.Parse(portGame.text));
// Create a server and listen on a port
public void SetupServer(int port)
{
NetworkServer.Listen(port);
isAtStartup = false;
NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);
NetworkServer.RegisterHandler(MsgType.Disconnect, OnDisconnected);
NetworkServer.RegisterHandler(MsgType.Error, OnError);
SceneManager.LoadSceneAsync(scene);
}
вот код который я использую со стороны клиента для подключения:
Синтаксис:
Используется csharp
public void ConnectClient(int i)
{
ErrorLog ("Connected to " + hostData [i].gameName, TypeText.Info);
if (!ErrorLogInt (hostData[i].connectedPlayers, hostData[i].playerLimit, "Мак. число игроков"))
return;
if (hostData [i].passwordProtected) {
passwordPanel.SetActive (true);
passwordPanel.transform.GetChild (2).GetComponent<Button> ().onClick.AddListener (() => Connect (i));
return;
}
Network.Connect(hostData[i]);
string ip = "localHost";
for (int z = 0; z < hostData[i].ip.Length; z++)
{
if (hostData[i].ip[z] != "")
{
ip = hostData[i].ip[z];
}
}
SetupClient(ip, hostData[i].port);
}
public void Connect(int i)
{
string password = Network.incomingPassword;
if (password == passwordPanel.transform.GetChild (1).GetComponent<InputField> ().text) {
Network.Connect (hostData [i]);
} else {
ErrorLog ("Пароль не верен!", TypeText.Error);
}
}
// Create a client and connect to the server port
public void SetupClient(string ip = "127.0.0.1", int port = 4444)
{
//ClientScene.RegisterPrefab(playerPrefs);
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.Connect(ip, port);
isAtStartup = false;
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.RegisterHandler(MsgType.Disconnect, OnDisconnected);
myClient.RegisterHandler(MsgType.Error, OnError);
SceneManager.LoadSceneAsync(scene);
}
{
ErrorLog ("Connected to " + hostData [i].gameName, TypeText.Info);
if (!ErrorLogInt (hostData[i].connectedPlayers, hostData[i].playerLimit, "Мак. число игроков"))
return;
if (hostData [i].passwordProtected) {
passwordPanel.SetActive (true);
passwordPanel.transform.GetChild (2).GetComponent<Button> ().onClick.AddListener (() => Connect (i));
return;
}
Network.Connect(hostData[i]);
string ip = "localHost";
for (int z = 0; z < hostData[i].ip.Length; z++)
{
if (hostData[i].ip[z] != "")
{
ip = hostData[i].ip[z];
}
}
SetupClient(ip, hostData[i].port);
}
public void Connect(int i)
{
string password = Network.incomingPassword;
if (password == passwordPanel.transform.GetChild (1).GetComponent<InputField> ().text) {
Network.Connect (hostData [i]);
} else {
ErrorLog ("Пароль не верен!", TypeText.Error);
}
}
// Create a client and connect to the server port
public void SetupClient(string ip = "127.0.0.1", int port = 4444)
{
//ClientScene.RegisterPrefab(playerPrefs);
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.Connect(ip, port);
isAtStartup = false;
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.RegisterHandler(MsgType.Disconnect, OnDisconnected);
myClient.RegisterHandler(MsgType.Error, OnError);
SceneManager.LoadSceneAsync(scene);
}
Так же со стороны сервера видно что подключены два клиента, узнаю я об это с помощью данного кода:
Синтаксис:
Используется csharp
GUILayout.Label("Player ping values");
int i = 0;
while (i < Network.connections.Length)
{
GUILayout.Label("Player " + Network.connections[i] + " - (Ping) " + Network.GetLastPing(Network.connections[i]) + " ms");
i++;
}
int i = 0;
while (i < Network.connections.Length)
{
GUILayout.Label("Player " + Network.connections[i] + " - (Ping) " + Network.GetLastPing(Network.connections[i]) + " ms");
i++;
}
При подключении клиентов к серверу, со стороны сервера создается игрок. Но он не двигается.
Так же если подключить еще один клиент к серверу, то опять на сервере появляется еще один игрок но со стороны клиентов виден только свой игрок но не игрок второго клиента.
Сначало я хотел использовать НетворкМанагер но при попытки подключиться с другова компьютера он не видет сервер.
Мне надо что бы Игрок был и сервером и клиентом одновременно и уже к ниму подключались клиенты.
Но я не могу добится желаемого результата. Извените за мой английский.
Вот еще Screenshots:
Сервер:
Скрытый текст:
Клиент:
Скрытый текст: