多米诺 发表于 2012-6-15 12:46

Unity3D中RPC函数的代码解析

using UnityEngine;
using System.Collections;

public class Chat : MonoBehaviour {

      bool usingChat = false;
    bool showChat = false;

    string inputField = "";

    Vector2 scrollposition;
    int width = 500;
    int height = 200;
    string playerName;
    float lastUnfocusTime = 0;
    Rect window;

    ArrayList playerList = new ArrayList();
    class PlayerNode
    {
      public string playerName;
      public NetworkPlayer player;//NetworkPlayer是一个数据结构,保存着你可以从网络定位的另一位玩家的信息。比如,基于NetworkPlayer你可以向另外一个玩家发送消息。


    }
    ArrayList chatEntries=new ArrayList();
    class ChatEntry
    {
      public string name="";
      public string text="";
    }
      // Use this for initialization
      void Start () {
      window = new Rect(Screen.width / 2-width/2,Screen.height-height+5,width,height);
      }
    void OnConnectedToServer()
    {
                playerName = PlayerPrefs.GetString("playerName","");
      if(playerName=="")
      {
            playerName = "RandomName"+Random.Range(1,999);
      }
      ShowChatWindow();
      networkView.RPC("TellServerOurName",RPCMode.Server,playerName);//在所有连接端调用一个RPC函数。
      addGameChatMessage(playerName+" hase just joined the chat!");
    }
   
    void OnServerInitialized()
    {
                playerName = PlayerPrefs.GetString("playerName","");
      if(playerName=="")
      {
            playerName = "RandomName"+Random.Range(1,999);
      }
      ShowChatWindow();
      PlayerNode newEntry =newPlayerNode();
      newEntry.playerName = playerName;
      newEntry.player = Network.player;
      playerList.Add(newEntry);
      addGameChatMessage(playerName+" hase just joined the chat!");
    }
    PlayerNode GetPlayerNode(NetworkPlayer netPlay)
    {
      foreach(PlayerNode entry in playerList)
      {
            if(entry.player==netPlay)
            {
                return entry;
            }
         
      }
      Debug.LogError("GetPlayNode:Requested a playernode of non-existing player!");
      return null;
    }
    void OnPlayerDisconnected(NetworkPlayer netPlayer)//当一个玩家从服务器上断开时在服务器端调用。
    {
      addGameChatMessage("A Player has discinnected");
      playerList.Remove(GetPlayerNode(netPlayer));
    }
    void OnDisconnectedFromServer()
    {
      CloseChatWindow();
    }
   

   
    void TellServerOurName(string name,NetworkMessageInfo info)//NetworkMessageInfo 网络数据信息,刚从网络接收的数据的相关信息会被保存到这个结构中。它揭示了从哪里来(数据源),什么时间发送和什么网络视图发送;其中包括:数据源、发送时间、网络视图。http://3d.ceeger.com/Script/NetworkMessageInfo/NetworkMessageInfo.html

    {
      PlayerNode newEntry = new PlayerNode();
      newEntry.playerName = playerName;
      newEntry.player = Network.player;
      playerList.Add(newEntry);
      addGameChatMessage(playerName+" has just joined the chat!");
    }
      void CloseChatWindow()
    {
      showChat = false;
      inputField = "";
      chatEntries = new ArrayList();
    }
      void ShowChatWindow()
    {
      showChat = true;
      inputField = "";
      chatEntries = new ArrayList();
    }
      
      
      void OnGUI () {
      if (!showChat) return;
      if(Event.current.type==EventType.keyDown && Event.current.character=='\n' & inputField.Length<=0)
      {
            if(lastUnfocusTime + .25f < Time.time)
            {
                usingChat = true;
                GUI.FocusWindow(5);
                GUI.FocusControl("Chat input field");
            }
      }
      window = GUI.Window(5,window,GlobalChatWindow,"");
      }

    void GlobalChatWindow(int id)
    {
      GUILayout.BeginVertical();
      GUILayout.Space(10);
      GUILayout.EndVertical();

      scrollposition = GUILayout.BeginScrollView(scrollposition);

      foreach(ChatEntry entry in chatEntries)
      {
            GUILayout.BeginHorizontal();
            if (entry.name == " - ")
            {
                GUILayout.Label(entry.name + entry.text);
            }
            else
            {
                GUILayout.Label(entry.name+": "+entry.text);
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(2);
      }

      GUILayout.EndScrollView();
      if(Event.current.type==EventType.keyDown && Event.current.character=='\n' & inputField.Length>0)
      {
            HitEnter(inputField);
      }
      GUI.SetNextControlName("Chat input field");
      inputField = GUILayout.TextField(inputField);

      if(Input.GetKeyDown("mouse 0"))
      {
            if(usingChat)
            {
                usingChat = false;
                GUI.UnfocusWindow();
                lastUnfocusTime = Time.time;
            }
      }
    }
      void HitEnter(string msg)
      {
            msg = msg.Replace('\n',' ');
            networkView.RPC("ApplyGlobalChatText",RPCMode.All,playerName,msg);
      }
   
    void ApplyGlobalChatText(string name,string msg)
   {
      ChatEntry entry=new ChatEntry();
       entry.name=name;
       entry.text=msg;

       chatEntries.Add(entry);

       if(chatEntries.Count>4)
       {
            chatEntries.RemoveAt(0);
       }
       scrollposition.y=1000000;
       inputField="";
   }
    void addGameChatMessage(string str)
    {
      ApplyGlobalChatText(" - ",str);
      if(Network.connections.Length>0)
      {
            networkView.RPC("ApplyGlobalChatText",RPCMode.Others," - ",str);
      }
    }
}

cbm010 发表于 2017-2-23 15:47

楼主是超人

xyz990 发表于 2017-2-23 15:04

顶顶多好

罗明工作 发表于 2017-2-23 15:12

真心顶

星空雪舞 发表于 2017-2-23 15:54

难得一见的好帖

心境 发表于 2017-2-23 15:58

LZ真是人才

贱丨人 发表于 2017-3-7 12:55

很不错

贱丨人 发表于 2017-3-7 13:22

楼主是超人

贱丨人 发表于 2017-3-7 12:37

好帖就是要顶

sunjunfa001 发表于 2017-3-7 12:41

说的非常好
页: [1] 2 3 4 5 6 7 8
查看完整版本: Unity3D中RPC函数的代码解析