2015-03-06 3 views
1

Я пытаюсь разработать онлайн-игру, в которой люди могут просто болтаться и общаться, но по какой-то причине куб клиента не отображается в игре сервера и наоборот, но сервер управляет клиентом и сервером. Вот код для обоих файлов:Проблемы с сетью - Клиент управления сервером

сети Сценарий:

using UnityEngine; 
using System.Collections; 
public class NetworkManager : MonoBehaviour 
{ 

string registeredGameName = "Hangout Zone"; 
bool isRefreshing = false; 
float refreshRequestLength = 3.0f; 
HostData[] hostData; 

private void StartServer() 
{ 
    Network.InitializeServer(16, 25002, false); 
    MasterServer.RegisterHost(registeredGameName, "Hangout Zone", "The place to chill with friends."); 
} 

void OnServerInitialized() 
{ 
    Debug.Log("Server has been initialized."); 
} 

void OnPlayerDisconnected(NetworkPlayer player) 
{ 
    Debug.Log("Player disconnected."); 
    Network.RemoveRPCs(player); 
    Network.DestroyPlayerObjects(player); 
} 

void OnApplicationQuit() 
{ 
    if (Network.isServer) 
    { 
     Network.Disconnect(200); 
     MasterServer.UnregisterHost(); 
    } 

    if (Network.isClient) 
    { 
     Network.Disconnect(200); 
    } 
} 

void OnMasterServerEvent(MasterServerEvent masterServerEvent) 
{ 
    if (masterServerEvent == MasterServerEvent.RegistrationSucceeded) 
    { 
     Debug.Log("Registration Successful."); 
    } 
} 

public IEnumerator RefreshHostList() 
{ 
    Debug.Log("Refreshing..."); 
    MasterServer.RequestHostList(registeredGameName); 
    float timeStarted = Time.time; 
    float timeEnd = Time.time + refreshRequestLength; 

    while (Time.time < timeEnd) 
    { 
     hostData = MasterServer.PollHostList(); 
     yield return new WaitForEndOfFrame(); 
    } 

    if (hostData == null || hostData.Length == 0) 
    { 
     Debug.Log("No active servers have been found."); 
    } 
    else 
    { 
     Debug.Log(hostData.Length + " have been found."); 
    } 

} 

private void SpawnPlayer() 
{ 
    Debug.Log("Spawning player..."); 
    Network.Instantiate(Resources.Load("Prefabs/Block"), new Vector3(0f, 2.5f, 0f), Quaternion.identity, 0); 
} 



public void OnGUI() 
{ 

    if (Network.isServer) 
    { 
     GUILayout.Label("Running as a server."); 
    } 
    else if (Network.isClient) 
    { 
     GUILayout.Label("Running as a client."); 
    } 

    if (Network.isClient) 
    { 
     if (GUI.Button(new Rect(25f, 25f, 150f, 30f), "Spawn")) 
     { 
      SpawnPlayer(); 
     } 
    } 
    if (Network.isClient || Network.isServer) 
    { 
     return; 
    } 

    if (GUI.Button(new Rect(25f, 25f, 150f, 30f), "Start New Server")) 
    { 
     StartServer(); 
    } 
    if (GUI.Button(new Rect(25f, 65f, 150f, 30f), "Refresh Server List")) 
    { 
     StartCoroutine("RefreshHostList"); 
    } 
    if (hostData != null) 
    { 
     for (int i = 0; i < hostData.Length; i++) 
     { 
      if (GUI.Button(new Rect(Screen.width/2, 65f + (30f * i), 300f, 30f), hostData[i].gameName)) 
      { 
       Network.Connect(hostData[i]); 
      } 
     } 
    } 
} 
} 

Сценарий управления: (Это JavaScript)

#pragma strict 

function Update() { 
    if (Input.GetKey(KeyCode.W)) 
    { 
     transform.position.z += 0.03; 
    } 

    if (Input.GetKey(KeyCode.S)) 
    { 
     transform.position.z -= 0.03; 
    } 

    if (Input.GetKey(KeyCode.A)) 
    { 
     transform.position.x -= 0.03; 
    } 

    if (Input.GetKey(KeyCode.D)) 
    { 
     transform.position.x += 0.03; 
    } 
} 
+0

Добавлен ли сборщик плеера в NetworkManager? – user3071284

ответ

0

Вы не нашли OnPlayerConnect или что-то подобное ? Я вижу только SpawnPlayer() и не вижу, как он звонит из любой точки мира, кроме кнопки.

В любом случае, вы создаете объект с помощью локального элемента управления. Это означает, что если второй игрок на самом деле породил больше кубов, вы бы контролировали все из них на всех машинах. Контрольный скрипт должен отвечать только тогда, если видит, что локальный игрок является владельцем объекта (так как я подозреваю, что у вас есть сценарий, прикрепленный ко всем разным блокам).

Я думаю, что единство имеет это в NetworkView.isMine свойство networkview. Добавьте что-то вроде этого в скрипт вашего контроллера:

function Update() { 
if (!networkView.isMine) { return; } 
if (Input.GetKey(KeyCode.W)) 
{ 
    transform.position.z += 0.03; 
} 
+0

Я добавил OnPlayerConnect, но все еще ничего не происходит –

+0

Я думаю, что что-то не так с Network.Instantiate, потому что всякий раз, когда игрок появляется, он дает мне ошибку для этого, но я понятия не имею, как его исправить. Я вставлю точную ошибку ниже. –

+0

Я думаю, что что-то не так с Network.Instantiate, потому что всякий раз, когда игрок появляется, он дает мне ошибку, но я понятия не имею, как это исправить. Я вставлю точную ошибку ниже. –

Смежные вопросы