在UNet中若要用程式碼生成物件,必須先和平常一樣用Instantiate生成物件,在透過「NetworkServer.Spawn」這個功能卵生到Client端。
也就是將一個存在於Server的物件,同步創建至Client端,再透過SyncVar等等前幾篇所教的來進行同步資訊,具體的程式碼如下
//生成物件 隨機出現在X Y -5~5的地方 GameObject newEnemy = Instantiate(enemy,new Vector2(Random.Range(-5,5),Random.Range(-5,5)),Quaternion.identity); //透過NetworkServer 卵生到Client端 NetworkServer.Spawn(newEnemy);
接下來要實作這一項功能,首先建立一個「Enemy」的敵人物件
將這個物件拖曳至Project視窗,建立成Prefab,並添加NetworkIdentity,這樣才能透過UNet卵生
這一步很重要
點選「Lobby」場景的「NetManager」,將剛剛建立的Prefab拖曳至NetworkManager中的Registered Spawnable Prefabs (註冊的卵生物件),若沒有在這邊增加物件是沒辦法進行卵生的。
撰寫一個EnemyCreater(敵人創建者)的腳本,作為自動升成怪物的腳本
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class EnemyCreater : NetworkBehaviour { //敵人物件 public GameObject enemy; //倒數時間 public float time = 0.5f; //剩餘時間 private float countdown; void Start () { countdown = time; } void Update () { if (!isServer) { //若不是Server則跳出 return; } //每經過一段時間建立一個新敵人 countdown -= Time.deltaTime; if (countdown <= 0) { countdown = time; createNewEnemy(); } } void createNewEnemy(){ //生成物件 隨機出現在X Y -5~5的地方 GameObject newEnemy = Instantiate(enemy,new Vector2(Random.Range(-5,5),Random.Range(-5,5)),Quaternion.identity); //透過NetworkServer 卵生到Client端 NetworkServer.Spawn(newEnemy); } }
在「Game」場景中建立一個空物件名為EnemyCreater,並將剛剛撰寫的同名腳本附加給他。
這邊我把「Server Only」給打勾的用意在於,進入場景時此物件只有Server會是啟用的狀態,Client則是被禁用的狀態,就可以過濾掉一些不想在Client執行的物件。
最終執行的畫面如下
本次教學到此結束,感謝你的閱讀!