使用Multiplayer Networking做一個簡單的多人遊戲例子-1/2
原文地址: http://blog.csdn.net/cocos2der/article/details/51006463
本文主要講述了如何使用Multiplayer Networking開發多人遊戲,文中實例、代碼來源於Unity官方教程。
原文:INTRODUCTION TO A SIMPLE MULTIPLAYER EXAMPLE
Networking Overview
The High Level API
Network System Concepts
OK,現在可以開始了!
1. 開始創建工程
- 創建一個空的3D工程
- 保存當前場景為”Main”
2. 使用 Network Manager
主要使用NetworkManager和NetworkManagerHUD(一個簡易的UI面板)
- 創建一個empty GameObject.
- 修改名稱為”Network Manager”
- 選中Network Manager對象體
- 添加組件:Network > NetworkManager
- 添加組件:Network > NetworkManagerHUD
NetworkManager組件的屬性:
NetworkManagerHUD組件屬性:
運行後,此時運行後效果(該UI就是NetworkManagerHUD):
3. 設置Player prefab
本實例中玩家GameObject效果(後面會加上武器):
開始創建Player GameObject:
- 創建一個Capsule膠囊體
- 修改名稱為“Player”
- 選中“Player”
- 創建一個Cube作為Player的子物體
- 修改Cube名稱為“Visor”
- 設置Visor Scale (0.95, 0.25, 0.5)
- 設置Visor Position (0.0, 0.5, 0.24)
- 創建一個新材質Material
- 修改材質Material名稱為“Black”
- 選中Black Material
- 修改其Albedo color 為黑色
- 將Visor的Material修改為Black Material
為了給Player添加uniqueID作為網絡中的唯一ID,我們需要給Player添加NetworkIdentity組件
- 選中Player GameObject
- 添加組件:Network > NetworkIdentity
- 設置NetworkIdentity組件屬性Local Player Authority為True,勾選上
將Local Player Authority勾選上,是為了後面Client能夠控制Player
最後創建Player的Prefab預制體:
- 將場景中的Player拖拽到Project面板中生成Prefab
- 刪除Scene中原來的Player
- 保存場景
4. 註冊Player prefab
- 選中Network Manager GameObject 在 Hierarchy 面板中
- 保存Network Manager被選中狀態
- 展開Network Manager屬性面板中Spawn Info
- 將Player prefab拖拽到Player Prefab框中
5. 創建Player 移動控制腳本
- 新建一個C#腳本為”PlayerController”, 並將其綁定到Player prefab上
PlayerController.cs:
using UnityEngine; public class PlayerController : MonoBehaviour { void Update() { var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f; var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f; transform.Rotate(0, x, 0); transform.Translate(0, 0, z); } }
- 保存腳本
- 保存場景
6. 測試Player的在線移動
- 運行Unity進入Play模式
-
運行模式下,NetworkManagerHUD將會顯示默認的UI
-
點擊LAN Host(H),將本機作為主機Host開始遊戲
此時NetworkManager將會創建一個Player在場景中,NetworkManagerHUD將會顯示為遊戲中UI
- 鍵盤WASD控制玩家Player移動方向
- 點擊UI中的Stop(X) 回到離線模式
- 點擊停止運行Unity,退出運行模式
開始測試在客戶端中控制玩家Player
為了測試多玩家,所以我們需要兩個客戶端。在這裏我們可以Build一個Mac版本(或者Windows版本)作為一個玩家,然後Unity自己運行作為一個玩家。OK,下面開始Build一個Mac版本.
- 打開Build Settings面板,並添加當前場景。
- 保存工程
- Build一個Mac standalone application
- 完成之後,點擊運行剛才Mac版本,並選擇Windows窗口模式運行,不要全屏運行。
- 點擊LAN Host(H),作為主機玩家
- 點擊WASD按鍵,移動一下Mac版本中的Player(不然另一個玩家加入的時候,位置在同一個位置,你有可能認為只有一個玩家)
現在回到Unity,將Unity作為另一個玩家加入遊戲。
- 運行Unity,進入Play模式
- 點擊LAN Client(C)加入遊戲。
此時你應該看到了兩個玩家在遊戲中。
- 關閉Mac客戶端
- 停止運行Unity
- 退出Play模式
7. 在網絡中控制Player移動
上一篇中,玩家操作移動會同時控制同屏內的所有Player,且只有自己的屏幕生效。因為咱們還沒有同步Transform信息。
下面我們通過UnityEngine.Networking組件來實現玩家控制各自Player- 打開PlayerController腳本
- 添加命名空間UnityEngine.Networking
using UnityEngine.Networking;
- 修改MonoBehaviour為NetworkBehaviour
public class PlayerController : NetworkBehaviour
在Update函數中添加如下方法
if (!isLocalPlayer) { return; }
最後你的PlayerController內容如下:
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class PlayerController : NetworkBehaviour { // Update is called once per frame void Update () { if (!isLocalPlayer) { return; } var x = Input.GetAxis("Horizontal") * Time.deltaTime * 10.0f; var z = Input.GetAxis("Vertical") * Time.deltaTime * 10.0f; transform.Translate(Vector3.right * x); //主角前後移動 transform.Translate(Vector3.forward * z); } public override void OnStartLocalPlayer() { GetComponent<MeshRenderer>().material.color = Color.blue; } }
使用Multiplayer Networking做一個簡單的多人遊戲例子-1/2