2014-09-19 59 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