目前我們的範例主要都集中在玩家物件上,但是大部分的遊戲會有非玩家物件存在於遊戲世界中。這次我們忽略環境物件,先集中在非玩家角色物件上。
玩家物件會在用戶端連上伺服器時生成,但敵人物件需要由伺服器主動生成。
在本次教學中,我們會新增一個敵人生成器(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類別中虛擬函式的資訊,可以參考以下頁面; NetworkBehaviour、Spawning、 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來判斷重生功能,但血量狀態由伺服器控制,所以血量會回到最大值。
上一篇:死亡和重生
沒有留言:
張貼留言