Hierarchy に存在するオブジェクトの参照を持っていて、それからインスタンスを作成する場合
生成時には active で終わったあとには disactive にすることがある
[SerializeField] private GameObject _resource; private void Create() { _resource.gameObject.SetActive(true); var list = new List<GameObject>(); for (int i = 0; i < 10; i++) { list.Add(Instantiate(_resource, transform)); } _resource.gameObject.SetActive(false); }
その度に同じような処理を書くのが面倒だったので Scopeにしてみた
public class ComponentActiveScore : System.IDisposable { private readonly GameObject _resource; private bool _isChange; public ComponentActiveScore(GameObject resource) { _resource = resource; // Parent が False で ヒエラルキーでアクティブじゃない場合は // インスタンスのないオブジェクトの可能性が高い if (_resource.transform.parent == null && !_resource.gameObject.activeInHierarchy) { _isChange = false; return; } _resource.SetActive(true); } public ComponentActiveScore(Component resource) : this (resource.gameObject) { } public void Dispose() { if (!_isChange) return; _resource.SetActive(false); } }
これを利用すると先程の処理はこうなる
[SerializeField] private GameObject _resource; private void Create() { var list = new List<GameObject>(); using (new ComponentActiveScore(_resource)) { for (int i = 0; i < 10; i++) { list.Add(Instantiate(_resource, transform)); } } }
行数は特に変わってないが、 GameObject を気にしなくても良くなった