unity3d
Recherche et collecte de GameObjects
Recherche…
Syntaxe
- public statique GameObject Find (nom de chaîne);
- statique publique GameObject FindGameObjectWithTag (balise de chaîne);
- statique publique GameObject [] FindGameObjectsWithTag (balise de chaîne);
- objet statique public FindObjectOfType (type type);
- public static Object [] FindObjectsOfType (type type);
Remarques
Quelle méthode utiliser
Soyez prudent lorsque vous recherchez GameObjects à l'exécution, car cela peut nécessiter beaucoup de ressources. Surtout: ne lancez pas FindObjectOfType ou Find in Update, FixedUpdate ou plus généralement dans une méthode appelée une ou plusieurs fois par frame.
- Appelez les méthodes d'exécution
FindObjectOfType
etFind
uniquement lorsque cela est nécessaire -
FindGameObjectWithTag
a de très bonnes performances par rapport aux autres méthodes basées sur les chaînes. Unity conserve des onglets séparés sur les objets marqués et interroge ceux-ci au lieu de la scène entière. - Pour les GameObjects "statiques" (tels que les éléments d'interface utilisateur et les préfabriqués) créés dans l'éditeur, utilisez la référence sérialisable de GameObject dans l'éditeur.
- Gardez vos listes de GameObjects dans List ou Arrays que vous gérez vous-même
- En général, si vous instanciez beaucoup de GameObjects du même type, jetez un coup d’œil au pool d’objets
- Mettez vos résultats de recherche en cache pour éviter les méthodes de recherche coûteuses.
Aller plus loin
Outre les méthodes fournies par Unity, il est relativement facile de concevoir vos propres méthodes de recherche et de collecte.
Dans le cas de
FindObjectsOfType()
, vos scripts peuvent conserver une liste d'eux-mêmes dans une collectionstatic
. Il est beaucoup plus rapide d'itérer une liste d'objets que de rechercher et inspecter des objets de la scène.Ou créez un script qui stocke leurs instances dans un
Dictionary
basé sur des chaînes, et vous pourrez développer un système de marquage simple.
Recherche par nom de GameObject
var go = GameObject.Find("NameOfTheObject");
Avantages | Les inconvénients |
---|---|
Facile à utiliser | Les performances se dégradent avec le nombre d'objets de jeu dans la scène |
Les chaînes sont des références faibles et suspectent les erreurs de l'utilisateur |
Recherche par tags de GameObject
var go = GameObject.FindGameObjectWithTag("Player");
Avantages | Les inconvénients |
---|---|
Possibilité de rechercher des objets simples et des groupes entiers | Les chaînes sont des références faibles et suspectent les erreurs de l'utilisateur. |
Relativement rapide et efficace | Le code n'est pas portable car les balises sont codées en dur dans les scripts. |
Inséré dans les scripts en mode édition
[SerializeField]
GameObject[] gameObjects;
Avantages | Les inconvénients |
---|---|
Belle performance | La collection d'objets est statique |
Code portable | Ne peut se référer qu'à GameObjects de la même scène |
Recherche de scripts GameObjects par MonoBehaviour
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
renvoienull
si aucun n'est trouvé.
Avantages | Les inconvénients |
---|---|
Fortement typé | Les performances se dégradent avec le nombre d'objets de jeu nécessaires pour évaluer |
Possibilité de rechercher des objets simples et des groupes entiers |
Recherche de GameObjects par nom à partir d'objets enfants
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
renvoienull
si aucun n'est trouvé
Avantages | Les inconvénients |
---|---|
Portée de recherche limitée et bien définie | Les chaînes sont des références faibles |