Kuinka saada luettelot (ja taulukot) Unityyn ottamaan vain tietyn “ -tyypin GameObjects ”

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

  1. Tee käyttäytymistä kutakin tyyppiä. ts. foo.cs, bar.cs jne.
  2. Luo haluamasi tyyppinen luettelo. ts. listaa huijaaja
  3. nyt, jos yrität lisätä palkki-ilmentymän foo: han, se antaa virheen. Palkkiobjektin lisääminen foo-virheilmoitukseen Kuvaus kirjoita kuvan kuvaus tähän kirjoita kuvan kuvaus tähän

    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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *