国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

Unity結合C++開發服務器實現多人游戲(七)

2019-11-06 09:24:18
字體:
來源:轉載
供稿:網友
角色登場,消失及同步化以下實現客戶端登陸后, 構建角色的登場,消失在游戲場景中.1.    客戶端A登陸成功的話,角色的位置發送給服務器”進入游戲”通知.2.    服務器端接收信息后,發送客戶端A已經存在角色信息,并且發送其它客戶端新的信息.3.    客戶端接收后添加新角色到游戲場景中.客戶端 "進入游戲!" 的信息在PIDL中定義.
  global Simple 1000  {      JoinGameScene([in] float x, [in] float y,  [in] float z, [in] float angle);      Player_Appear([in] int hostID, [in] std::wstring userID,          [in] float x, [in] float y,  [in] float z,          [in] float vx, [in] float vy,  [in] float vz,          [in] float angle);      Player_Disappear([in] int hostID);  ...  
客戶端登陸成功的話,通知服務器 "進入游戲!".
          m_stub.NotifyLoginSuccess = (HostID  remote, RmiContext rmiContext) =>          {              //  join the world!              m_PRoxy.JoinGameScene(HostID.HostID_Server,  RmiContext.ReliableSend,                  m_localPlayer.transform.position.x,                  m_localPlayer.transform.position.y,                  m_localPlayer.transform.position.z,                  m_localPlayer.GetComponent<PlayControl>().carAngle); //  show 30 ends here  ...  
現在,添加服務器處理的代碼.
  class SimpleServer  {      DECRMI_Simple_JoinGameScene;  ...      DEFRMI_Simple_JoinGameScene(SimpleServer)  {      // validation  check      auto it =  m_remoteClients.find(remote);      if (it == m_remoteClients.end())      {          return true;      }      auto& rc =  it->second;          // update player  info      rc->m_x = x;      rc->m_y = y;      rc->m_z = z;      rc->m_angle =  angle;  
以上代碼中JoinGameScene繼續添加一下代碼.
  DEFRMI_Simple_JoinGameScene(SimpleServer)  {  ...      assert(it->first  == remote);          // Let incomer  know others, let others know incomers.      for (auto otherIter : m_remoteClients)      {          if (otherIter.first != it->first)          {              auto&  otherRC = otherIter.second;              m_proxy.Player_Appear((HostID)it->first,  RmiContext::ReliableSend,                  (HostID)otherIter.first,                  otherRC->m_userID,                  otherRC->m_x,  otherRC->m_y, otherRC->m_z,                  otherRC->m_vx,  otherRC->m_vy, otherRC->m_vz,                  otherRC->m_angle);              m_proxy.Player_Appear((HostID)otherIter.first,  RmiContext::ReliableSend,                  (HostID)it->first,                  rc->m_userID,                  rc->m_x,  rc->m_y, rc->m_z,                  rc->m_vx,  rc->m_vy, rc->m_vz,                  rc->m_angle);          }      }  
以上代碼解析如下:1.    接收到的更新游戲角色的信息。2.    傳遞之前客戶端名單,告知客戶端新用戶的加入。同樣,告知新客戶端現有客戶端的加入。客戶端離開的情況,進行相反的處理. 離開后,出現"客戶端OO消失"的信息.
          m_netServer->OnClientLeave =  [this](CNetClientInfo* info, ErrorInfo*, const ByteArray&)      {          //  let others know the disappear          vector<int>  others;          for (auto otherIter : m_remoteClients)          {              others.push_back(otherIter.first);          }          m_proxy.Player_Disappear((HostID*)others.data(),  others.size(),              RmiContext::ReliableSend,              info->m_HostID);  ...  
調用以上遠程函數時,變量HostID的數組進入.這樣的話,可對多個設備進行信息發送.添加客戶端中調用Player_Appear的處理代碼.,在游戲場景中角色登場.
  public class NetManager : MonoBehaviour  {      public GameObject m_remotePlayerPrefab;        void Start()      {            m_stub.Player_Appear  = (HostID remote, RmiContext rmiContext, int hostID,  System.String userID, float x, float y, float z, float vx, float vy, float vz, float angle) =>          {              if (hostID != (int)m_netClient.GetLocalHostID())              {                  var  rot = Quaternion.AngleAxis(angle, new UnityEngine.Vector3(0,  1, 0));                    var  remotePlayerCharacter =  (GameObject)Instantiate(m_remotePlayerPrefab, new UnityEngine.Vector3(x, y, z), rot);                  remotePlayerCharacter.name  = "RemotePlayer/" +  hostID.ToString();              }              return true;          };  
設置以下條件.Unity Editor中選擇NetManager GameObject后,在 Inspector中 m_remotePlayerPrefab下添加名為RemotePlayer的Prefab.如果沒有 RemoteCar Prefab的話,制作場景內LocalPlayer的復制版后,并刪除所有的 Script Behavior.調用Player_Disappear后, 此角色在游戲場景中被刪除.
  m_stub.Player_Disappear =  (Nettention.Proud.HostID remote,      Nettention.Proud.RmiContext  rmiContext, int hostID) =>  {      var g =  GameObject.Find("RemotePlayer/" +  hostID.ToString());      if (g != null)      {          Destroy(g);      }      return true;  };  
現在進行測試. 運行兩個以上的客戶端后,角色登場.首先會出現角色的位置,但是無法操控,下篇將繼續講述.第八篇:Unity結合C++開發服務器實現多人游戲(八)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 涡阳县| 滦南县| 城市| 汉沽区| 甘孜县| 通山县| 桦甸市| 新竹市| 赤城县| 焦作市| 加查县| 乐业县| 淅川县| 周口市| 辉县市| 新绛县| 贞丰县| 婺源县| 墨玉县| 东阳市| 龙川县| 丹东市| 东莞市| 于田县| 新疆| 自贡市| 安泽县| 涟水县| 云霄县| 太和县| 新民市| 齐齐哈尔市| 宜宾市| 双江| 电白县| 出国| 米脂县| 牙克石市| 沅陵县| 九江市| 无锡市|