La nouvelle astuce pour créer un Prefab imbriqué dans Unity3D

La nouvelle astuce pour créer un Prefab imbriqué dans Unity3D

Et si je vous disais que vous pouvez améliorer votre vitesse de Level Design avec 1 seul script ? Oui, un seul ! Le tout permettant de créer un Prefab imbriqué (ou autant que vous voulez).

Ce n’est pas le problème que vous recherchez

Lorsque vous construisez votre level design, vous commencez généralement par poser des blocs grossiers pour définir l’ensemble. Donner la vue globale du niveau.

Une fois validé, vous allez remplacer ces blocs par des éléments décoratifs plus raffinés. Si vous travaillez avec un modeleur, c’est à ce moment là que vous allez intégrer ses modèles 3D.

Que vous soyez en solo ou en équipe, cette partie du développement peut être grisante mais aussi extrêmement frustrante. Il est absolument fantastique de voir son niveau prendre vie morceau par morceau. Mais cela peut rapidement devenir l’enfer si on ne s’y prend pas correctement.

C’est à ce moment là qu’il faut utiliser des Prefabs pour vous simplifier le travail.

Le hic

Mais de par son fonctionnement, le Prefab impose une limitation. Lorsque vous enregistrez un Prefab à partir d’un GameObject, Unity va tout simplement faire une copie de la structure, des composants et des variables exposées pour en faire un modèle.

Aucun autre lien n’est conservé.

Cela implique que si vous utilisez une instance d’un Prefab A en enfant d’un autre Prefab B, le lien ne sera pas conservé. Si vous modifiez le Prefab A, cela ne modifiera pas le Prefab B… Dans l’idéal, on voudrait quelque chose comme ça :

Schéma de fonctionnement attendu pour un Préfab imbriqué

C’est un problème épineux qui a été adressé par de nombreux Assets sur le store, comme Nested Prefabs. Mais il existe également des solutions gratuites pour contourner cette problématique.

Comment gérer un Prefab imbriqué

Cette technique, utilisée par Sébastien Dubois développeur de Gadiabots, permet de passer outre cette contrainte.

Lorsque vous construisez un Prefabs, vous utilisez généralement la même technique. Vous construisez un GameObject, vous en faites un Prefab et le dupliquez sur la scène.

Toute la structure est copiée et vous pouvez répercuter les modifications simplement. Quelque chose comme ça :

Schéma de fonctionnement standard des Prefabs

Tout va bien tant que vous ne voulez pas rajouter de la modularité supplémentaire et conserver le lien d’un Prefab dans un autre Prefab.

Unity ne gère pas nativement les Prefabs imbriqués. Il faut donc changer votre façon de construire vos Prefabs pour gérer cette modularité en amont de la création de celui-ci. Voilà en image la marche à suivre :

Schéma de fonctionnement pour créer un Prefab imbriqué

Utilisation dans Unity

C’est bien beau tout ça, mais comment fait-on pour utiliser ça et créer un Prefab imbriqué dans Unity ?

La génération de votre Prefab composite se fait via le script suivant (oui juste ça) :

using UnityEngine;

public class NestedPrefab : MonoBehaviour
{
#if UNITY_EDITOR
    [SerializeField]
    protected GameObject prefabTarget;

    [ContextMenu("Apply nested Prefab")]
    public virtual void ApplyNestedPrefab()
    {
        UnityEditor.PrefabUtility.ReplacePrefab(this.gameObject, this.prefabTarget, UnityEditor.ReplacePrefabOptions.ReplaceNameBased);

        Component nestedPrefabComponent = this.prefabTarget.GetComponentInChildren<NestedPrefab>();
        GameObject.DestroyImmediate(nestedPrefabComponent, true);
    }
#endif
}

En bonus, vous pouvez également ajouter l’éditeur custom pour ce composant. Attention, ce script est à créer dans un répertoire « Editor » pour être pris en compte :

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(NestedPrefab))]
public class NestedPrefabCustomEditor : Editor
{
  public override void OnInspectorGUI()
  {
    DrawDefaultInspector();

    if (GUILayout.Button("Apply nested Prefab"))
    {
      NestedPrefab targetNestedPrefab = (NestedPrefab)target;
      targetNestedPrefab.ApplyNestedPrefab();
    }
  }
}

Source.

C’est tout le code dont vous aurez besoin. Le reste se passe dans l’éditeur.

Pour commencer, on doit créer un Prefab du niveau le plus bas souhaité (le plus simple possible). Par exemple une marche d’escalier :

Exemple de Prefab

Vous pouvez voir dans la hiérarchie que c’est un Prefab, tout à fait classique. L’idée est de construire un escalier avec plusieurs marches, mais de pouvoir modifier la forme des marches.

On va donc créer notre GameObject “modèle” comme vu plus haut. C’est une composition de plusieurs Prefabs et potentiellement d’autres éléments spécifiques :

 

Vous remarquerez que ce n’est pas un Prefab ! C’est un simple GameObject qui représente la structure du Prefab que l’on souhaite créer. Notez en revanche que les marches sont, elles, des instances du Prefab que nous avons créé en premier lieu.

Attachez le script NestedPrefab à ce GameObject. Vous pouvez voir qu’il vous demande un lien vers un Prefab.

Attention, c’est là qu’il ne faut pas se rater. Si vous regardez bien le schéma vu plus haut, le modèle doit rester indépendant, il ne faut donc pas qu’il devienne une instance du Prefab. C’est très important !

Faites donc une copie de celui ci sur la scène et transformez cette copie en un Prefab (drag’n’drop jusqu’à la fenêtre projet). Vous vous retrouvez donc avec une instance d’un Prefab imbriqué et la même version indépendante sur la scène. Assignez le Prefab fraîchement créé sur le Nested Prefab.

Exempel de Prefab construit sur un modèle de Prefab imbriqué

Voilà, le plus dur est fait.

Votre structure est en place. A partir de là, la marche à suivre est relativement simple :

  • Faites vos ajustement sur votre premier Prefab et appliquez les modifications : elles sont alors répercutées sur votre GameObject modèle.
  • Sélectionnez votre GameObject modèle, cliquez sur le bouton “Apply nested Prefab”. Les modifications du modèle sont copiées dans le Prefab et toutes les instances de votre Prefab complexe sont mises à jour.

Cette méthode implique une petite gymnastique concernant la construction de vos Prefabs, mais vous donne beaucoup de liberté quand à la construction de Prefabs composites.

Notez que vous pouvez chaîner cette méthode pour créer plusieurs niveaux de composition. La seule chose à garder en tête est de conserver un modèle indépendant du Prefab qu’il va générer.

Pour aller plus loin

Pour aller encore plus loin, vous pouvez construire plusieurs niveaux et avoir un Prefab imbriqué encore plus complexe. Avec cette technique, cela implique de faire plusieurs manipulations pour mettre à jour toute la chaîne de modèles et de Prefabs.

C’est là que vous pouvez créer vos propres outils pour gérer cette chaîne de mise à jour, et par exemple lier ça derrière un menu personnalisé. En 1 seul clic, vos 4 niveaux de Prefabs sont mis à jour, et tous les modèles 3D de vos lampes sont modifiés dans tous les Prefabs que vous avez créé.

Besoin de tester un rendu visuel ? Besoin d’ajouter un petit détail à plusieurs Prefabs qui ont une base commune ? Besoin de changer une texture ? Tout ça peut se faire très simplement en utilisant cette façon de faire.

A vous de jouer !

Cet article vous a servi ? 

  • Partagez-le sur les réseaux
  • Laissez un commentaire
>