處理非角色物件

在先前的章節,我們都在處理玩家。但是在遊戲中可能會有其他由伺服器控制的物件。在這個範例內專注於處理敵人這種會變化的伺服器物件,而不注意場景物件。

  1. 製作敵人的出生點,新增空遊戲物件,命名為 Enemy Spawner
  2. 掛載 NetworkIdentity Component ,並將 Server Only 打勾,表示這是伺服器才可觸發的物件。
  3. 新增 MonoBehaviour 腳本,掛載在 Enemy Spawner 上。
  4. 修改腳本程式碼為:

     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);
             }
         }
     }
    
  5. 上方的程式碼裡面做了四件事:
    1. 使用 Networking 命名空間。
    2. 改用 NetworkBehaviour。
    3. 改寫 OnStartServer 方法。
    4. 當伺服器端開始執行時,會產生數個敵人在敵人出生點上。
    5. OnStartServer 相當類似 OnStartLocalPlayer ,但在這情況下,前者是在伺服器端開始監控連線時被觸發。
  6. 準備敵人的角色物件,我們從原本的玩家角色物件為基底重製。
  7. 移除一些沒在敵人身上用到的物件,像是子彈發射腳本和角色控制腳本等等。
  8. Netowrk Manager ,把敵人的角色Prefab加到 Registered Spawnable Prefabs 內。
  9. 回到 Enemy Spawner ,把敵人的角色Prefab指定給 enemyPrefab 欄位。
  10. 設定產生的敵人數量為4。
  11. 儲存場景和專案。
  12. 因為敵人扣血的機制和UI是要和玩家一樣的,所以就不修改腳本。
  13. 測試,射擊敵人會扣血,但是當血量歸零時會跳回滿血狀態。因為敵人是伺服器物件,不會進到 RpcRespawn 方法內。

results matching ""

    No results matching ""