ScriptableObject as Runtime Set
RuntimeSet 的做法是將 ScriptableObject 作為一個分享集合容器,在執行期間,將物件放入,讓其他要使用它的物件可以透過這個分享容器拿到。
以下的例子中,將建立一個 GameObjectRuntimeSet ,這個 GameObjectRuntimeSet 將會在執行時持有 Circle 物件集合,而 Circle 物件將由 CreateObject 建立,而 ObjectMonitor 負責查看 GameObjectRuntimeSet 中有多少 Circle 物件
以下建立一個通用抽象類 RuntimeSet 它繼承 ScriptableObject
1 | public abstract class RuntimeSet<T> : ScriptableObject |
接著繼承 RuntimeSet 建立一個 GameObjectRuntimeSet , 這個 GameObjectRuntimeSet 將為 GameObject 的分享集合容器
1 | [] |
在 Unity 編輯器中建立一個 ScriptableObject 實體 CircleRuntimeSet
接著建立要放到這個集合的物件 Circle ,在 OnEnable 時將自己加入集合, OnDisable 時將自己從集合中移除
1 | public class Circle : MonoBehaviour |
把 ScriptableObject 實體 CircleRuntimeSet 設定到 Circle 的 GameObjectRuntimeSet 中,讓 Circle 知道在 OnEnable 時要放入哪個集合。之後,把 Circle 轉為 Prefab
再建立一個製造Circle的 CreateObject,這邊建立一個按鈕,當按下時,會觸發 CreateObject.Create()
1 | public class CreateObject : MonoBehaviour |

最後建立一個觀看這個集合的物件
1 | public class ObjectMonitor : MonoBehaviour |
觀察結果
每按下按鈕一次,所產生的 Circle 物件都會加入 GameObjectRuntimeSet ,而需要知道有多少個 Circle 的物件,它只要從 GameObjectRuntimeSet 裏面就可以找到目前有多少 Circle 物件。
總結
RuntimeSet將ScriptableObject作為分享的集合容器。- 它可以避免使用 Singleton 來管理物件群
- 它避免了使用
Object.FindObjectOfType或GameObject.FindWithTag等開銷可能會比較大的方法來搜尋物件
Reference: