[Unity] 使用 For 迴圈讀取 Class 下的所有欄位

發表日期:
2020.11.12
/
分類:
Dev
如果想要在 Class 下存放多筆相同類型的物件時常會使用陣列來達成,但在有些不方便使用陣列的地方時該怎麼辦呢?今天要筆記的是 System.Type 的應用,他可以讓 Class 變得像

如果想要在 Class 下存放多筆相同類型的物件時常會使用陣列來達成,但在有些不方便使用陣列的地方時該怎麼辦呢?今天要筆記的是 System.Type 的應用,他可以讓 Class 變得像陣列一樣,可以用簡單的迴圈將所有資料取出。

這裡有一個名為 Window 的類別。如你所見,下面存放了五個公開的 GameObject 物件,而我們的目的是用 For 迴圈來將這裡的物件們取出。

public class Window { public GameObject character; public GameObject inventory; public GameObject quest; public GameObject achievement; public GameObject setting; }

用法 Usage

一開始,我們必須先有一個實體化的 Window 物件。

Window window = new Window();

為求方便,這裡就先假設 Window 下的五個 GameObject 皆已存有資料,我們要將他們一次取出使用。


接下來開始準備讀取資料,我們必須先宣告一個 Type 並用 typeof 取出 Window 的 Type。

Type type = typeof(Window);

擁有 Window 的 Type 後,再宣告一個 FieldInfo 陣列來存放用 GetFields 取出的欄位資訊。(這時的 fieldInfos 中僅記錄著 Class 下的公開欄位架構,並不包含值)。

如果叫不出 FieldInfo 的話,請確保你有成功 Using System.Reflection 命名空間。

FieldInfo[] fieldInfos = type.GetFields();


最後用 For 迴圈搭配 GetValue 即可帶出 Window 下的所有欄位內容。

這裡要注意兩件事情:

  1. GetValue 取出的資料是 object 而不是原始的 GameObject,必須手動將他轉回來。
  2. GetValue 內要帶入的參數是最前面我們實體化、存有五個 GameObject 的 Window 物件,並不是其他奇怪的東西。

for(int i = 0; i < fieldInfos.Length; i++) { GameObject gameObject = (GameObject)fieldInfos[i].GetValue(window); // TODO }

這樣子就可以輕鬆的讀取物件下的資料了,當初為了要實現這個看了一堆文章都看不懂呢……

程式範例 Example

using System; using System.Reflection; using UnityEngine; public class WindowProperty : MonoBehaviour { public Window window; [Serializable] public class Window { public GameObject character; public GameObject inventory; public GameObject quest; public GameObject achievement; public GameObject setting; } private void Start() { Type type = typeof(Window); FieldInfo[] fieldInfos = type.GetFields(); for (int i = 0; i < fieldInfos.Length; i++) { GameObject gameObject = (GameObject)fieldInfos[i].GetValue(window); Debug.Log(gameObject.transform.position); } } }

參考資料 Reference

comments powered by Disqus