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
- Viselkedés minden típus. azaz foo.cs, bar.cs stb.
- Készítse el a kívánt típusú listát. azaz a bolondok listázása
-
most, ha megpróbálja hozzáadni a sávpéldányt a foo-hoz, akkor ez hibát ad.
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