2014-09-19 109 views
0

我想產生一個客戶端和服務器都可以看到的彈跳球。 當客戶端連接並且下一個場景(球彈起時)被加載時,必須產生球。當客戶端連接時產卵球

問題是,方法OnPlayerConnected()不會被調用,有沒有人知道任何替代方案,爲什麼它不工作?

public class MainMenu : MonoBehaviour { 

public string connectionIP = "127.0.0.1"; 
public int connectionPort = 25001; 
bool isClientConnected = false; 

void Awake() 
{ 
    // Make sure list is empty and request a new list 
    MasterServer.RequestHostList("MyUniqueGameType"); 
} 



// Use this for initialization 
void OnGUI() 
{ 
    HostData[] data = MasterServer.PollHostList(); 
    // Go through all the hosts in the host list 
    foreach (var element in data) 
    { 
     //Debug.Log ("server found"); 
     GUILayout.BeginHorizontal();  
     var name = element.gameName + " " + element.connectedPlayers + "/" + element.playerLimit; 
     GUILayout.Label (name); 
     GUILayout.Space (5); 
     string hostInfo; 
     hostInfo = "["; 
     foreach (var host in element.ip) 
      hostInfo = hostInfo + host + ":" + element.port + " "; 
     hostInfo = hostInfo + "]"; 
     GUILayout.Label (hostInfo); 
     GUILayout.Space (5); 
     GUILayout.Label (element.comment); 
     GUILayout.Space (5); 
     GUILayout.FlexibleSpace(); 
     if (GUI.Button (new Rect (10, 30, 120, 20), "Client Connect")) 
     { 
      Network.Connect (connectionIP, connectionPort); 
      isClientConnected = true; 
      Application.LoadLevel ("scene1"); 

      // Debug.Log ("spawning ball"); 
      // SpawnBall(); 


     } 
     GUILayout.EndHorizontal(); 

    } 


    if (GUI.Button (new Rect (10, 50, 120, 20), "Initialize Server")) 
    { 
     Network.InitializeServer (2, connectionPort, !Network.HavePublicAddress()); 
     // Network.InitializeServer (2, 25002, !Network.HavePublicAddress()); 
     MasterServer.RegisterHost ("MyUniqueGameType", "JohnDoes game", "l33t game for all"); 
        /* 
        while(!isClientConnected) 
        { 
         Debug.Log("waiting for client"); 
        } 
        */ 

     Application.LoadLevel("scene1"); 

    } 
} 

void OnPlayerConnected(NetworkPlayer player) 
{ 
    Debug.Log ("OnPlayerConnected"); 
    SpawnBall(); 
} 


void SpawnBall() 
{ 
    GameObject objPrefab = Resources.Load("Ball") as GameObject; 
    GameObject obj = Instantiate(objPrefab) as GameObject; 
} 

回答

1

當您加載新場景時,此腳本停止執行。所以消息處理程序OnPlayerConnected將永遠不會在客戶端或服務器上調用。

你可以做的,而不是爲使用RPC(遠程過程調用),讓客戶端通知服務器時,它已經連接並加載場景(這將走在第二個場景):

void Start() { 
    if(Network.isClient) { 
     networkView.RPC("SpawnBall", RPCMode.AllBuffered) 
    } 
} 

[RPC] 
void SpawnBall(NetworkViewID viewID, Vector3 location) { 
    GameObject objPrefab = Resources.Load("Ball") as GameObject; 
    GameObject obj = Instantiate(objPrefab) as GameObject; 
} 

現在,當客戶端加載場景時,他會發送一個RPC給服務器,告訴他產生一個球。 Start函數中的注意事項我使用Network.isClient來指定此代碼只應在客戶端加載場景時執行。 RPCMode.AllBuffered會將RPC發送給所有連接的播放器,包括髮送它的客戶端。

RPC是一個有價值的工具,如果在Unity中進行聯網,您應該熟悉它們。

+0

非常感謝!它在沒有RPC的情況下僅在客戶端上運行,但現在我使用RPC時,我現在得到錯誤: 由於沒有啓動連接,無法發送RPC功能。 UnityEngine.NetworkView:RPC(String,RPCMode,Object []) SpawnBall:Start()(在Assets/scripts/SpawnBall.cs:11) 兩個玩家都可以移動並可以看到彼此移動,所以沒有任何問題連接我猜.. – PrisonMike 2014-09-19 23:55:12

+0

沒關係,我已經將loadlevel放入連接的服務器上的方法,它現在可以工作 – PrisonMike 2014-09-20 10:05:23