2018年4月29日 星期日

【Unity官方教學分享】處理非玩家角色物件

網頁連結

目前我們的範例主要都集中在玩家物件上,但是大部分的遊戲會有非玩家物件存在於遊戲世界中。這次我們忽略環境物件,先集中在非玩家角色物件上。
玩家物件會在用戶端連上伺服器時生成,但敵人物件需要由伺服器主動生成。

在本次教學中,我們會新增一個敵人生成器(Enemy Spawner),用來創建可以被玩家攻擊的敵人物件。

  • 新增空物件命名為EnemySpawner,並在EnemySpawner上...
  • 新增Network->NetworkIdentity元件
  • 將NetworkIdentity中的Server Only設為true
將Server Only設為true,可以防止EnemySpawner發送給用戶端。

  • 在EnemySpawner物件上新增名為EnemySpawner的腳本
  • 開啟腳本將以下內容複製貼上:
using UnityEngine;
using UnityEngine.Networking;

public class EnemySpawner : NetworkBehaviour 
{

    public GameObject enemyPrefab;
    public int numberOfEnemies;

    public override void OnStartServer()
    {
        for (int i=0; i < numberOfEnemies; i++)
        {
            Vector3 spawnPosition = new Vector3(
                Random.Range(-8.0f, 8.0f),
                0.0f,
                Random.Range(-8.0f, 8.0f));

            Vector3 spawnRotation = Quaternion.Euler( 
                0.0f, 
                Random.Range(0,180), 
                0.0f);

            GameObject enemy = (GameObject)Instantiate(enemyPrefab, spawnPosition, spawnRotation);
            NetworkServer.Spawn(enemy);
        }
    }
}
這裡稍微提一下腳本中的幾個關鍵:

  • 首先命名空間UnityEngine.Networking是必須的
  • 繼承NetworkBehaviour也是需要的
  • 使用虛擬函式OnStartServer來實現功能
  • 當伺服器啟動時,會隨機產生需多位置和旋轉數值,接著呼叫NetworkServer.Spawn(enemy)生成敵人物件
OnStartServer和OnStartLocalPlayer非常相似,前面教學曾經使用OnStartLocalPlayer更改玩家物件的顏色。在伺服器開始監聽網路時,OnStartServer會被伺服器呼叫。更多關於NetworkBehaviour類別中虛擬函式的資訊,可以參考以下頁面; NetworkBehaviourSpawning、 NetworkBehaviour Scripting

現在生成器已經完成,接著我們要製作被生成的敵人物件。
為了方便,我們會使用 Player prefab為基礎來製作,因為敵人物件需要的NetworkIdentity、NetworkTransform、血量和血條在Player prefab上都有了。

首先我們要對Player prefab做一點修改,讓玩家可以辨識敵人與玩家的差別。
  • 拖曳Player prefab到Hierarchy視窗生成一個Player物件
  • 將這個Player物件重新命名為Enemy
  • 選擇Hierarchy視窗中的Enemy,刪除它的子物件"Gun"
  • 刪除子物件BulletSpawn
  • 移除PlayerController腳本
  • 拖曳Enemy到Project視窗下,生成一個Enemy prefab
我們在這個過程中生成新的Enemy prefab,是為了防止修改物件的過程中更動到Player prefab。依照上述步驟,場景中的物件會連接到新的prefab上。

到這裡,基本上我們已經準備好敵人物件,但是它目前看起來和玩家一樣,所以要添加一點細節。
  • 將Enemy物件的Material設為Black
  • 新增Material並命名為White
  • 將子物件Visor的Material設為White
  • 在Enemy下新增一個Cube子物件,重新命名為Mohawk
  • 將Mohawk的Position設為(0.0, 0.55, -0.15)
  • 將Mohawk的Scale 設為(0.2, 1.0, 1.0)
  • 移除Mohawk的BoxCollider
Enemy現在看起來會是這樣:
  • 點擊Enemy物件Inspector視窗下的Apply
  • 刪除場景中的Enemy物件
現在完成Enemy prefab,接著我們要將Enemy prefab註冊,並添加到敵人生成器上。
  • 選擇Hierarchy視窗中的NetworkManager
  • 找到Spawn Info屬性並展開
  • 按下Registered Spawnable Prefabs旁的+按鈕新增欄位,將Enemy prefab拖曳上去
  • 選擇Hierarchy視窗中的EnemySpawner
  • 找到 Enemy prefab變數,將Enemy Prefab拖曳上去
  • 把 Number Of Enemies設為4
至於Health腳本,就保持和玩家物件一樣,Bullet腳本判斷敵人和判斷玩家的方式都是呼叫Health腳本中的函式,所以我們不做更動。
現在我們編譯後可以進行測試,測試連線時結果的方法點我

測試後我們應該可以看到有敵人物件加入遊戲中,射擊敵人物件會讓它們血量減少,而減少至零時它們不會重生,因為敵人物件沒有isLocalPlayer來判斷重生功能,但血量狀態由伺服器控制,所以血量會回到最大值。

上一篇:死亡和重生

沒有留言:

張貼留言

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...