当客户端连接时产卵球
问题描述:
我想产生一个客户端和服务器都可以看到的弹跳球。 当客户端连接并且下一个场景(球弹起时)被加载时,必须产生球。当客户端连接时产卵球
问题是,方法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;
}
答
当您加载新场景时,此脚本停止执行。所以消息处理程序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中进行联网,您应该熟悉它们。
非常感谢!它在没有RPC的情况下仅在客户端上运行,但现在我使用RPC时,我现在得到错误: 由于没有启动连接,无法发送RPC功能。 UnityEngine.NetworkView:RPC(String,RPCMode,Object []) SpawnBall:Start()(在Assets/scripts/SpawnBall.cs:11) 两个玩家都可以移动并可以看到彼此移动,所以没有任何问题连接我猜.. – PrisonMike 2014-09-19 23:55:12
没关系,我已经将loadlevel放入连接的服务器上的方法,它现在可以工作 – PrisonMike 2014-09-20 10:05:23