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

最終執行的畫面如下

 

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

Leave a Comment