Jos koodasin yleisessä C #: ssa, voin luoda luettelon, joka tallentaa vain tietyntyyppisen objektin. Jos yritän vahingossa lisätä luetteloon muuta kuin kyseistä tyyppiä, minulle kerrotaan asiasta nopeasti ja voin korjata ongelman nopeasti.
List<Foo> my_list = new List<Foo>(); my_list.Add(Bar) //Error
Kuitenkin koska ”m käyttämällä Unityä komentosarjani on liitettävä GameObjectiin ja se on tallennettava luetteloon.
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
Haluan, että luettelo tallentaa vain Foo ”GameObjects (GameObjects with Foo -komponentti), mutta mikään ei estä minua vahingossa tallentamasta minkä tahansa tyyppisiä GameObject-aiheita, mikä voisi (ja on jo saanut aikaan) naarmuttamaan päätäni yrittäessäni selvittää ongelmaa.
Onko GameObject-alatyyppi mahdollista siten, että sillä on List<GameObject(Foo)> my_list
-vaikutus? Onko tapa tehdä se myös matriisien kanssa?
Vastaa
Jos haluat tallentaa vain GameObject
-tyyppejä, jotka sisältävät tietyn Component
elementti, helpoin ratkaisu on käyttää erityistä Component
-luettelotyyppiä.
B ase Component
-luokka sisältää viitteen isäntään GameObject
. Rajoittamalla luettelosi tiettyyn Component
-kohtaan saat silti pääsyn kaikkiin vastaaviin GameObject
-palveluihin.
alla oleva komentosarja on esimerkki siitä, miten hallinnoit tätä yleisessä luokassa Collider
. Olen sisällyttänyt menetelmän nimenomaan elementin lisäämiseen, joka palauttaa bool
vahvistamaan, onko Collider
todellakin löydetty GameObject
, ja menetelmä nimenomaisesti vaaditun GameObject
-noutamiseksi suoraan luettelon hakemistosta.
///<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; }
Bonuspisteitä varten voit muuttaa tämän perusluokaksi geneeristen aineiden avulla. Käyttämällä yleistä pohjaista luokassa Component
voit luoda ilmentymiä lennossa edustamaan mitä tahansa komponenttia; kaikki komponentit perivät Component
.
Vastaa
- Tee käyttäytymistä kutakin tyyppiä. ts. foo.cs, bar.cs jne.
- Luo haluamasi tyyppinen luettelo. ts. listaa huijaaja
-
nyt, jos yrität lisätä palkki-ilmentymän foo: han, se antaa virheen.
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. }
Toivottavasti se auttaa. Jos se ei riitä, anna kommentti täällä. Kiitos