處理非角色物件
在先前的章節,我們都在處理玩家。但是在遊戲中可能會有其他由伺服器控制的物件。在這個範例內專注於處理敵人這種會變化的伺服器物件,而不注意場景物件。
- 製作敵人的出生點,新增空遊戲物件,命名為 Enemy Spawner 。
- 掛載 NetworkIdentity Component ,並將 Server Only 打勾,表示這是伺服器才可觸發的物件。
- 新增 MonoBehaviour 腳本,掛載在 Enemy Spawner 上。
修改腳本程式碼為:
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++) { var spawnPosition = new Vector3( Random.Range(-8.0f, 8.0f), 0.0f, Random.Range(-8.0f, 8.0f)); var spawnRotation = Quaternion.Euler( 0.0f, Random.Range(0,180), 0.0f); var enemy = (GameObject)Instantiate(enemyPrefab, spawnPosition, spawnRotation); NetworkServer.Spawn(enemy); } } }
- 上方的程式碼裡面做了四件事:
- 使用 Networking 命名空間。
- 改用 NetworkBehaviour。
- 改寫 OnStartServer 方法。
- 當伺服器端開始執行時,會產生數個敵人在敵人出生點上。
- OnStartServer 相當類似 OnStartLocalPlayer ,但在這情況下,前者是在伺服器端開始監控連線時被觸發。
- 準備敵人的角色物件,我們從原本的玩家角色物件為基底重製。
- 移除一些沒在敵人身上用到的物件,像是子彈發射腳本和角色控制腳本等等。
- 到 Netowrk Manager ,把敵人的角色Prefab加到 Registered Spawnable Prefabs 內。
- 回到 Enemy Spawner ,把敵人的角色Prefab指定給 enemyPrefab 欄位。
- 設定產生的敵人數量為4。
- 儲存場景和專案。
- 因為敵人扣血的機制和UI是要和玩家一樣的,所以就不修改腳本。
- 測試,射擊敵人會扣血,但是當血量歸零時會跳回滿血狀態。因為敵人是伺服器物件,不會進到 RpcRespawn 方法內。