抓取元件 ( GetComponent )

遊戲物件可套用不同元件來增加需要的功能,使用 GetComponent 可抓取特定的元件並進行互動。

這段教學以多個不同的情境說明 GetComponent 的使用方法:

 

用於控制燈光

新增一個 Point Light 燈光物件,再建立燈光的控制腳本,使用 GetComponent 抓取燈光元件,設定數值來控制燈光的亮度、顏色。

以上的範例使用數字控制燈光的亮度,若需要使用單一按鈕進行燈光的開關操作,可改用以下的寫法。

原理是新增一個變數 m_isOn 記錄燈光的狀態,只有關閉的時候可以開燈,只有開啟的時候可以關燈。

這個變數在 Inspector 將會顯示 Is On ,也可以用 Private 宣告變數使其不顯示。進入遊戲後按下空白鍵即可開燈或關燈。

 

除了使用 GetComponent 控制物件本身的元件,也可以先抓取其他物件再控制該物件上的元件。

若找不到對應的物件名稱、元件名稱、參數名稱,將會出現錯誤訊息:

NullReferenceException: Object reference not set to an instance of an object (物件參照沒有設定到正確的物件實體)

使用「名稱」尋找物件 player = GameObject.Find ("Player");

使用「標籤」尋找物件 player = GameObject.FindGameObjectWithTag ("Player");

 

用於製作 UI

需要將變數的值顯示到 UI 時,也需要使用 GetComponent 抓取 Text 元件,以下是 Standard Assets 顯示遊戲畫面 FPS 的腳本:

 

用於控制玩家 HP

將 ThirdPersonController 玩家角色預製物件拖曳到遊戲場景,重新命名為「Player」,並將標籤設定為「Player」。

將 MultipurposeCameraRig 攝影機拖曳到場景,按下 Play 按鈕測試遊戲,確認玩家移動時攝影機會自動跟隨。

場景上新增 2 個物件,使用 2 個材質讓物件呈現不同的顏色讓玩家區分:

.紅色 - 玩家碰到將會扣血的炸彈,重新命名為 「Bomb」

.藍色 - 玩家接觸可以補血的藥水,重新命名為 「HealthPickup」

Bomb.cs 炸彈腳本

使用 GameObject.Find("Player") 找到玩家,當玩家碰到炸彈時,扣除設定的血量(先設定減 10),並且刪除炸彈遊戲物件。

 

再修改 Bomb.cs 炸彈腳本,因為玩家碰到炸彈時沒有爆炸效果,而且損傷修改比較麻煩。

透過宣告變數,動態生成爆炸效果,並且讓損傷可以直接透過 Inspector 屬性編輯器設定。

將爆炸的粒子效果 Explosion 拖曳到 Bomb 物件的 Explosion Prefab 欄位,設定 Attack Damage 對玩家的損傷數值。

 

確認玩家碰到炸彈後,血量扣除設定的數值。

 

HealthPickup 補血腳本

 

用於製作血條 ( 使用 Energy Bar Toolkit 第三方外掛 )

建立一個 PlayerStats.cs 腳本,宣告 playerHP 與 playerMP 變數,用於儲存玩家狀態,套用到玩家角色。

建立一個 Controller.cs 腳本,建立一個空物件並套用此腳本,功能是將玩家 HP 與血量數值同步。

 

修改 Controller.cs 腳本,玩家血量低於 0 時將會出現 GAME OVER,實際上應該再讓玩家角色執行倒地的動作。

 

注意!沒有 RemoveComponent() 移除元件的敘述 , 如果需要移除一個元件可以使用 Object.Destroy 指令。

Destroy(GetComponent(MeshRenderer));

關於 Destroy 的使用方法可參閱 Unity 網站 的說明。

 

用於判斷物件的元件

使用 GetComponent 判斷物件是否帶有指定的元件,以下 3 種寫法功能相同。