1. 程式人生 > >使用Multiplayer Networking做一個簡單的多人遊戲例子-1/2

使用Multiplayer Networking做一個簡單的多人遊戲例子-1/2

lap settings isl log atime round 窗口 bottom -m

原文地址: 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