일반 C #으로 코딩하는 경우 특정 유형의 개체 만 저장하는 목록을 만들 수 있습니다. 실수로 목록에 해당 유형 이외의 항목을 추가하려고하면 즉시 알려주고 문제를 신속하게 해결할 수 있습니다.
List<Foo> my_list = new List<Foo>(); my_list.Add(Bar) //Error
하지만 저는 Unity를 사용하면 스크립트를 GameObject에 첨부해야하며 목록에 저장해야합니다.
List<GameObject> my_list = new List<GameObject>(); GameObject Foo = new GameObject; Foo.AddComponent<Foo>(); GameObject Bar = new GameObject; Bar.AddComponent<Bar>(); my_list.Add(Foo) //Fine my_list.Add(Bar) //Works, but I don"t want it to
목록에 “Foo “GameObjects (Foo 구성 요소가있는 GameObjects), 그러나 실수로 어떤 유형의 GameObject를 저장하는 것을 막을 수있는 방법은 없습니다. 문제를 디버깅하려고 할 때 몇 시간 동안 머리를 긁적 일 수 있습니다.
List<GameObject(Foo)> my_list
효과를 갖도록 GameObject를 하위 유형으로 지정하는 방법이 있습니까? 배열로도 수행 할 수있는 방법이 있습니까?
답변
특정 Component
div를 포함하는 GameObject
유형 만 저장하려는 경우 > 요소에서 가장 쉬운 해결책은 목록 유형에 특정 Component
를 사용하는 것입니다.
B ase Component
클래스는 “host GameObject
“에 대한 참조를 포함합니다. 목록을 특정 Component
로 제한해도 각각의 GameObject
에 액세스 할 수 있습니다.
아래 스크립트는 일반 Collider
클래스에 대해이를 관리하는 방법의 예입니다. Collider
가 실제로 iv에서 발견되었는지 확인하기 위해 bool
를 반환하는 요소를 추가하는 방법을 특별히 포함했습니다. id = “c8c18e8354″>
및 목록의 색인을 기반으로 필요한 GameObject
를 직접 검색하는 방법입니다.
///<summary>A list of generic collider types, populated through the inspector.</summary> public List<Collider> colliders; ///<summary>Adds a collider reference to the list, using the host game object.</summary> ///<param name="targetGameObject">The game object to reference the collider from./<param> ///<returns>True, if the game object contained a collider, else returns false.</returns> public bool AddGameObjectToList(GameObject targetGameObject) { Collider targetCollider = GameObject.GetComponent<Collider>(); if(targetCollider == null) { return false; } else { colliders.Add(target collider); return true; } } <summary>Provides direct reference to the game object of a certain element in the list.</summary> ///<param name="index">The index pointer to the collider holding the desired game object.<param> ///<returns>The game object associated with the provided index in the component list.</returns> public GameObject GetGameObject(int index) { return colliders[index].GameObject; }
보너스 포인트의 경우 제네릭을 사용하여이를 기본 클래스로 전환 할 수 있습니다. Component
클래스에서 기반 의 제네릭을 사용하면 모든 구성 요소를 나타내는 인스턴스를 즉석에서 만들 수 있습니다. 모든 구성 요소는 Component
에서 상속됩니다.
답변
- 각 유형. 예 : foo.cs, bar.cs 등
- 원하는 유형의 목록을 만듭니다. 즉 List foolist
-
이제 bar 인스턴스를 foo에 추가하려고하면 오류가 발생합니다.
public Transform fooObjects; List<Foo> fooList; Bar b; // Use this for initialization void Awake () { fooList = new List<Foo>(); foreach (Transform item in fooObjects) { Foo f = item.gameObject.GetComponent<Foo>(); if(f != null) { fooList.Add(f); } else { Debug.Log("There are some object which is not FOO"); } } b = new Bar(); } void OnEnable () { foreach (var item in fooList) { item.gameObject.transform.name = "THIS IS FOO"; } fooList.Add(b); // this will throw an error in the debug window. }
도움이 되었기를 바랍니다. 충분하지 않은 경우 여기에 의견을 남겨주세요. 감사합니다