Je crée ce qui est essentiellement mon propre système préfabriqué. Les objets de jeu sont définis par un fichier de données lisibles par l'homme. Je voudrais créer un GameObject vide, le charger avec les composants définis dans le fichier de données et l'avoir prêt et en attente d'un Instantiate()
appel. Cependant, chaque fois que j'utilise GameObject go = new GameObject()
un nouvel objet de jeu est ajouté à la scène.
En utilisant Unity intégré dans les préfabriqués, je peux charger un préfabriqué en tant que GameObject, et il n'est pas ajouté à la scène. (Voir l'exemple ci-dessous)
La raison derrière cela est que j'aimerais avoir une liste qui contient GameObjects, certains générés par le chargement de préfabriqués Unity et d'autres créés par mon système de préfabriqués personnalisés. Cela doit se produire au moment de l'exécution et ne peut pas impliquer l'éditeur Unity (car, idéalement, les utilisateurs finaux pourraient définir leurs propres fichiers de données).
Comment puis-je créer un nouveau GameObject sans que Unity l'instancie automatiquement pour moi?
Par exemple, je peux faire un appel comme celui-ci:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
Et je vais obtenir une liste de GameObjects, dont aucun n'est ajouté à la scène lorsque l'appel est effectué. Essentiellement, je crée une LoadAll
méthode pour mes propres préfabriqués, et de même, je ne veux pas instancier les GameObjects lorsque l'appel est effectué.
la source
Destroy
le GameObject. Ce qui le supprime de la scène et le libère, le rendant inutilisable.go.SetActive(false)
est le meilleur moyen de créer quelque chose comme un pool d'objets. Ce n'est pas exactement ce que vous voulez, mais vous pourriez peut-être avoir un petit groupe d'objets inactifs qui seront ensuite clonés pour votre instanciation personnalisée.Réponses:
Vous pouvez changer les hideFlags du GameObject?
J'ai juste essayé de faire ça:
... et c'est là, mais ce n'est pas dans la hiérarchie. Techniquement, c'est dans la scène, mais vous ne le voyez pas jusqu'à ce que vous remettiez ses drapeaux à HideFlags.None. Ce n'est pas la réponse que vous cherchez, mais au moins en ce qui concerne la publication aux développeurs, c'est plus propre que de regrouper vos objets.
la source
Vous ne pouvez pas faire exactement cela, malheureusement. Cependant, vous pouvez accomplir le même modèle de conception (c.-à-d. En éloigner la construction de vos objets, puis les appeler simplement avec une seule commande plus tard) via un modèle d'usine .
Lorsque vous voulez un objet, appelez quelque chose comme
Factory.CreateGameEntity()
, et cette méthode gérera tout dans les coulisses.la source
GetComponent<>() != null
. Avec mes fichiers de données, l'analyseur doit rechercher le composant correct dans les données. Idem pour obtenir une valeur à l'intérieur d'un composant, etc. LaGameObject
classe fournit de nombreuses fonctionnalités qui doivent être dupliquées par l'analyseur.Il n'y a aucun moyen de le faire
go = new GameObject();
sans l'ajouter à la scène.Je travaille sur un RTS où la base de joueurs doit être persistante, et essentiellement, nous sérialisons tout ce qu'ils ont fait et le rechargeons au moment de l'exécution en utilisant des actifs modifiés du magasin.
La plupart des sorties en XML ou JSON, il est donc assez simple de charger le fichier et de le manipuler comme vous le souhaitez.
la source
La bonne façon est de faire un préfabriqué, vous allouez ce préfabriqué en tant qu'objet, puis chaque fois que vous voulez instancier, utilisez simplement la référence de cet objet et convertissez-le en GameObject.
ex:
la source
Pour charger un préfabriqué dans une variable afin de pouvoir l'instancier plus tard, vous utiliseriez le code suivant:
Je l'ai fait dans un projet avec Unity 5.5. Il sera disponible pour instancier mais pas dans la scène ou une partie de la hiérarchie jusqu'à ce qu'il soit instancié normalement.
la source