Comment créer des listes (et des tableaux) dans Unity pour prendre uniquement les GameObjects dun certain “ type ”

Si je codais en C # générique, je peux créer une liste qui ne stocke quun certain type dobjet. Si jessaye accidentellement dajouter autre chose que ce type à la liste, on men informera rapidement et je pourrai résoudre le problème rapidement.

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

Cependant parce que je « m en utilisant Unity, mon script doit être attaché à un GameObject, et cela doit être stocké dans la liste.

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 

Je veux seulement que la liste stocke « Foo « GameObjects (GameObjects avec le composant Foo), cependant rien ne mempêche de stocker accidentellement nimporte quel type de GameObject, ce qui pourrait (et ma déjà) fait me gratter la tête pendant des heures pour essayer de déboguer le problème.

Existe-t-il un moyen de sous-saisir un GameObject afin quil ait leffet de List<GameObject(Foo)> my_list? Réponse

Si vous souhaitez uniquement stocker des types GameObject contenant un Component, la solution la plus simple est dutiliser le Component spécifique pour le type de liste.

Le b La classe ase Component contient une référence à la classe « host GameObject« . Si vous limitez votre liste au Component spécifique, vous aurez toujours accès à chaque GameObject.


Le ci-dessous le script est un exemple de la façon dont vous géreriez cela pour la classe générique Collider. Jai inclus une méthode spécifiquement pour ajouter lélément, qui renverra un bool pour confirmer si un Collider a été effectivement trouvé sur le GameObject, et une méthode spécifiquement pour récupérer directement le GameObject requis basé sur un index dans la liste.

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

Pour les points bonus, vous pouvez en faire une classe de base, en utilisant des génériques. Lutilisation dun générique basé dans la classe Component vous permet de créer des instances à la volée pour représenter nimporte quel composant; tous les composants héritent de Component.

Answer

  1. Make Behavior for chaque type. cest-à-dire foo.cs, bar.cs etc
  2. Créez le type de liste souhaité. cest-à-dire List foolist
  3. maintenant si vous essayez dajouter une instance de barre à foo, cela donnera une erreur. Ajout dun objet bar à toto donnant une erreur Description entrez la description de limage ici entrez la description de limage ici

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

Jespère que cela vous aidera. Si cela ne suffit pas, veuillez commenter ici. Merci

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *