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

最終執行的畫面如下

 

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



相關文章

都是初始化,Awake、Start的差異 當我們要在 Unity 中處理初始化的部分時,大多都是寫在「Start」的函式中,但若寫在「Awake」也能有差不多的效果。 那 Start 跟 Awake 差在哪邊呢? 首先要先看一下Unit...
如何用UGUI製作簡易HP條 Unity的UGUI是很方便的UI工具,這篇文章會教大家如何製作簡單的HP條,以及如何讓HP條顯示在物件的頭上。 這邊先提供兩個簡單的圖片供教學用 生命條 生命條的框...
教學 #05 – 物件創造、物件銷毀 這次來講到物件創造與物件銷毀,我們繼續使用先前的小飛兵專案來教學,這次要做的功能是「按下鍵盤Z發射子彈」並且「子彈超過一定距離時銷毀」,在這次教學中會使用到先前的移動與鍵盤事件。 創造...
遊戲程式入門 #02 變數宣告與資料型態 何謂變數?變數是在程式語言中的基本概念之一,從字面上解釋就是「可變動的數」,用來作為存放資料的一個載體,存放資料的類型則是依據「資料型態」來定義。   宣告變數的程式碼如下: ...