[ UNet ] 基礎教學 #06 – Spawn 卵生

標籤: , , , , ,

在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執行的物件。

最終執行的畫面如下

 

本次教學到此結束,感謝你的閱讀!



相關文章

教學 #01 – 物件建立與Hello World! 上一篇文章中提到安裝與版面配置,這一篇文章中我們來撰寫第一行程式碼 目前我們的畫面應該是長這樣的 Hierarchy中有一個Main Camera 在上一篇文章中我們有提...
教學 #07 – 碰撞器、觸發器、剛體(二)... ---Rigidbody - 剛體--- 想必第一次看到這詞的人一定會問:「剛體是什麼?」這東西不像碰撞器與觸發器那樣可以從字面上來解讀,想知道完整解釋的話可以查查維基百科。 大...
教學 #12 – Layer(層級) 另一個與Tag很像的東西叫做Layer,是層級、階層的意思,在Unity中與Tag有同樣的功能,但是Layer會牽扯到碰撞判定。 Layer的設定方式與Tag一致,位置就在Tag的右邊而已 ...
遊戲程式入門 #03 印出訊息,Debug Log、print... 在先前的 #00 Unity腳本建立與HelloWorld! 中有提到 Debug.Log 這個函式,這是用來印出除錯訊息的功能 每個語言都會有類似的功能,用來幫助開發者在開發時進行除錯,或是...