Hogyan készítsük a listákat (és tömböket) a Unity-ben, csak bizonyos “ típusú ”

Ha általános C # kódot kódoltam, létrehozhatok egy listát, amely csak egy bizonyos típusú objektumot tárol. Ha véletlenül megpróbálok az adott típustól eltérő dolgot felvenni a listába, azonnal értesítem, és gyorsan megoldhatom a problémát.

List<Foo> my_list = new List<Foo>(); my_list.Add(Bar) //Error 

Azonban, mert ” a Unity használatával a parancsfájlomat egy GameObject-hez kell csatolni, és azt a listában kell tárolni.

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 

Csak azt akarom, hogy a lista a “Foo” -t tárolja “A GameObjects (GameObjects a Foo komponenssel), azonban semmi sem akadályoz meg véletlenül bármilyen típusú GameObject tárolását, aminek következtében (és már most is) órákig kapkodtam a fejem, és megpróbáltam hibakeresni a problémát.

Van-e mód a GameObject altípusra, hogy List<GameObject(Foo)> my_list legyen a hatása? Van rá mód tömbökkel is?

Válasz

Ha csak olyan GameObject típusokat szeretne tárolni, amelyek egy adott Component elem, a legegyszerűbb megoldás a specifikus Component használata a listatípushoz.

A b az ase Component osztály hivatkozást tartalmaz a “host GameObject“. Ha listáját a Component fájlra korlátozza, akkor is hozzáférést kap minden egyes GameObject -hez.


A Az alábbi szkript egy példa arra, hogyan kezelné ezt az általános Collider osztályban. Felvettem egy kifejezetten az elem hozzáadására szolgáló módszert, amely egy bool -t ad vissza annak megerősítésére, hogy valóban található-e Collider a GameObject, és kifejezetten a szükséges GameObject módszer közvetlen lekérésére a listában szereplő index alapján.

///<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; } 

A bónuszpontokért ezt általános osztályt használhatja általános osztályok használatával. A Component osztályban alapú generikus generál használata lehetővé teszi, hogy menet közben olyan példányokat hozzon létre, amelyek bármely komponenst képviselnek; minden komponens öröklődik a Component címről.

Válasz

  1. Viselkedés minden típus. azaz foo.cs, bar.cs stb.
  2. Készítse el a kívánt típusú listát. azaz a bolondok listázása
  3. most, ha megpróbálja hozzáadni a sávpéldányt a foo-hoz, akkor ez hibát ad. Sávobjektum hozzáadása a hibához, hibát adva Leírás írja ide a kép leírását írja ide a kép leírását

    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. } 

Remélem, hogy ez segít. Ha ez nem elég, kérjük, tegyen megjegyzést ide. Köszönöm

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük