Unity에서 목록 (및 배열)을 만드는 방법은 특정 “ 유형 ”

일반 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를 하위 유형으로 지정하는 방법이 있습니까? 배열로도 수행 할 수있는 방법이 있습니까?

답변

특정 ComponentGameObject 유형 만 저장하려는 경우 > 요소에서 가장 쉬운 해결책은 목록 유형에 특정 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에서 상속됩니다.

답변

  1. 각 유형. 예 : foo.cs, bar.cs 등
  2. 원하는 유형의 목록을 만듭니다. 즉 List foolist
  3. 이제 bar 인스턴스를 foo에 추가하려고하면 오류가 발생합니다. 오류를주는 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. } 

도움이 되었기를 바랍니다. 충분하지 않은 경우 여기에 의견을 남겨주세요. 감사합니다

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다