RPC是个好东西。以 ChatRoom 为例子,我们来看看如何使用之。 先弄个连接管理的代码 Connection.js: var ServerAddr : String = "127.0.0.1"; var ServerPort : int = 2224; function OnGUI() { GUILayout.BeginArea(Rect(Screen.width-200,0,200,200)); if (Network.peerType == NetworkPeerType.Disconnected) { GUILayout.Label("Connection status: Disconnected"); ServerAddr = GUILayout.TextField(ServerAddr, GUILayout.MinWidth(100)); ServerPort = parseInt(GUILayout.TextField(ServerPort.ToString())); if (GUILayout.Button("Connect as client")) { Network.Connect(ServerAddr, ServerPort); } if (GUILayout.Button("Start Server")) { Network.InitializeServer(32, ServerPort, false); } } else { if (Network.peerType == NetworkPeerType.Connecting) { GUILayout.Label("Connection status: Connecting"); } else if (Network.peerType == NetworkPeerType.Client) { GUILayout.Label("Connection status: Connected"); } else if (Network.peerType == NetworkPeerType.Server) { GUILayout.Label("Connection status: Server!"); GUILayout.Label("Connection: " + Network.connections.length); } if (GUILayout.Button("Disconnect")) { Network.Disconnect(200); } } GUILayout.EndArea(); } ------------------------------------ 然后弄个 Chat.js,负责写聊天的逻辑: ------------------------------------ var chatWords : String = ""; var inputWord : String = "input words here.";
function OnGUI () { if (Network.isClient) { GUILayout.BeginArea(Rect(0,0,300,600)); GUILayout.TextArea(chatWords); GUILayout.BeginHorizontal(); inputWord = GUILayout.TextArea(inputWord); if (GUILayout.Button("Send")) { networkView.RPC("SomeoneSay", RPCMode.All, inputWord); inputWord = ""; } GUILayout.EndHorizontal(); if (GUILayout.Button("Disconnect")) { Network.Disconnect(200); } GUILayout.EndArea(); } } @RPC function SomeoneSay(sayWord : String, info : NetworkMessageInfo) { chatWords = chatWords + "\n" + info.sender + ":" + sayWord; } -------------------------------------------- 好,代码就完毕了。继续下面的一些拖拽操作: 1. 建立一个场景,把 Connection.js、Chat.js 绑到 MainCamera 上 2. 给 MainCamera 弄个 NetworkView Component,并将 State Synchronization = off,因为不需要同步位置等等信息。 3. 运行一下,哈哈,是不是很简单。
代码细解 通过 networkView.RPC("funcname", RPCMode, args ...) 调用 remote function。 其中 RPCMode 可以决定哪些人可以收到此 RPC,具体参见:http://unity3d.com/support/docum ... erence/RPCMode.html 以 @RPC 开头的函数,则为被调用的函数。RPC函数最后的 info 参数是可选项,表示 sender 的一些信息。 Unity网络层核心思想 把这个 ChatRoom 完成,我才真正理解了 Unity 对网络层的管理。:-P Scene ==1:N ==> GameObject ==1:N==> Component。 一个场景挂着多个 GameObject,每个 GameObject 上挂了很多 Component (比如 NetworkView、各个Script 等等) 一个 GameObject 要挂上一个 NetworkView,这个 GameObject 才能收发网络数据。对,数据的收发,都是针对一个个 GameObject 而言的。 参考资料 RPC Details,http://unity3d.com/support/docum ... net-RPCDetails.html
本文转自:http://kasicass.blog.163.com/blog/static/395619201112663538463/
|