Créer des menus personnalisés dans l’éditeur Unity 3D

Avoir des outils adaptés, c’est l’un des secrets de l’efficacité. Créer des menus personnalisés fait partie des choses qu’il est intéressant de maîtriser. Peu importe le projet sur lequel vous allez travailler, il y a un moment où vous aurez besoin de créer des menus personnalisés afin de vous faciliter la vie.

Introduction

On entend souvent dire qu’en comparaison du moteur Unreal, Unity 3D manque de fonctionnalités comme un éditeur de shaders ou un système comme les Blueprints. Mais contrairement à Unreal, Unity 3D est facilement extensible ce qui offre beaucoup plus de possibilité de personnalisation et une plus grande souplesse. Vous pouvez très simplement surcharger l’éditeur pour créer vos propres outils, entre autres ajouter des menus un peu partout… c’est ce que nous allons voir dans ce tutoriel.

La personnalisation des menus passe par l’ajout d’Attributs. Ce n’est pas une spécificité d’Unity 3D mais une fonctionnalité du langage C# : voir la documentation Microsoft. Nous allons donc voir ensemble quels Attributs utiliser pour obtenir le résultat attendu. Chacun des points suivants est basé sur le même principe : créer un point d’accroche dans l’éditeur pour exécuter du code que vous aurez écrit.

Menus personnalisés dans le menu principal

Commençons par le plus général : ajouter une entrée dans le menu principal de l’éditeur. Le menu principal, c’est la barre en haut que voici :

Menu principal d'Unity 3D

Si votre projet est entièrement vide, vous pouvez déjà constater qu’il y a un menu de plus sur cette image : « Mobile Input ». Il est ajouté par le module d’Assets Standards, et c’est exactement la même chose que nous allons faire !

Dans le cas d’une extension du menu principal (comme d’un menu de préférences plus bas), c’est une configuration globale propre à l’éditeur que nous allons écrire. Dans ce cadre, les scripts de définition doivent être placés dans un répertoire spécial « Editor » afin d’être pris en compte :

Répertoire spécial Editor

 

Créez donc un nouveau script MyCustomMenus dans le répertoire « Editor ». Unity vous prépare un script correspondant à un MonoBehaviour mais ce n’est pas ce qui nous intéresse. Modifiez le script comme suit :

using UnityEngine;

public class MyCustomMenus
{

}

Plus de référence à MonoBehaviour, c’est une simple classe. Dans cette classe, vous allez définir vos points d’entrée pour le menu principal. Il n’y a pas besoin d’étendre une classe particulière pour puisque nous allons utiliser des Attributs.

Ajoutez une méthode statique à cette classe comme suit :

[MenuItem("Mon Menu/Dire bonjour")]
public static void SayHello()
{
    Debug.Log("Hello ! :)");
}

Notez que l’attribut MenuItem est dans le namespace UnityEditor, il vous faudra donc l’importer. En utilisant cet Attribut, vous allez définir à la volée une entrée de menu pour l’éditeur. Le mot clé static est indispensable car ce code sera appelé sans contexte « objet » par l’éditeur. Le nom du MenuItem correspond à l’arborescence de menus séparée par des slashs. Dans notre cas, l’éditeur va générer un menu « Mon Menu » qui aura un enfant « Dire Bonjour » :

Exemple de menus personnalisés

En cliquant sur ce menu, le code écrit dans la méthode sera appelé pour effectuer le traitement qu’on veut. Ici, la console nous dit bonjour :

Vous pouvez créer l’arborescence que vous voulez avec ce principe, y compris ajouter des entrées dans des menus existants :

Autre exemple de menus personnalisés

Menus personnalisés sur un composant

Il est possible de créer un menu personnalisé associé à un composant. Dans ce cadre, le menu sera contextuel. Vous pourrez donc effectuer des traitements sur ce composant via un menu de ce type. Il vous vous faut d’abord un MonoBehaviour. Attention de ne pas le mettre dans le répertoire « Editor » ! Si vous placez des MonoBehaviours dans ce répertoire vous aurez des soucis lors de la compilation. Dans le meilleure des cas, le moteur vous enverra sur les roses en indiquant qu’il manque des classes, dans le pire des cas il ne dira rien et vos comportements ne seront pas exécutés !

public class MyComponent : MonoBehaviour
{
    [ContextMenu("Se présenter")]
    private void SayMyName()
    {
        Debug.Log("Coucou, je suis un composant de " + gameObject.name);
    }
}

Ici, pas de mot clé static car la méthode sera appelée dans le contexte du composant. Vous pouvez donc accéder à tous les éléments de ce dernier : son GameObject, son Transform, les autres composants sur le GameObject et ainsi de suite.

Visuellement, l’entrée est ajoutée sur le menu de gestion du composant sous la roue crantée ici :

Exemple de menus personnalisés sur un composant

Menus personnalisés dans les Préférences

Pour créer un menu personnalisé dans les préférences, le fonctionnement est très proche de celui pour créer une entrée dans le menu principal. On est de nouveau dans un cadre sans contexte, donc il nous faut une méthode statique, sur un script dans le répertoire « Editor » :

[PreferenceItem("Mes préférences Custom")]
public static void MyCustomPreferences()
{
    GUILayout.Button("test");
}

Cette extention vous fait apparaître un onglet supplémentaire dans la fenêtre de Préférences :

Onglet supplémentaire dans les préférences

Dans cette méthode, vous pouvez construire votre interface de la même manière que pour un inspecteur personnalisé ou une fenêtre personnalisée.

Extension du menu de création d’Assets

L’intérêt d’étendre le menu de création d’Assets est de permettre la création de ScriptableObjects. Un Asset de ce type permet de stocker des données et / ou des comportements. Pour se faire, on utilise toujours le même principe des Attributs :

[CreateAssetMenu(fileName ="monAsset", menuName = "Mes Assets/Mon Asset personnalisé")]
public class MyCustomAsset : ScriptableObject
{

}

Notez que cette fois, l’attribut est placé sur la classe est non pas sur une méthode. On y définit le nom par défaut de l’Asset créé ainsi que l’arborescence du menu. On obtient alors ceci :

Exemple de menus personnalisés pour créer un Asset

En cliquant sur l’entrée de menu, l’éditeur va créer un Asset dans le projet :

Asset basé sur un ScriptableObject dans la fenêtre Project

Vous pouvez maintenant créer des descripteurs de données dans vos projets avec cette méthode !

Aller plus loin

La personnalisation de l’éditeur de s’arrête pas là. Vous pouvez également personnaliser tout un tas de choses comme la modification de l’affichage de l’inspecteurs de vos composants ou encore la façon dont réagit un GameObject lorsqu’il est sélectionné sur la scène.

Marre de ne pas retrouver vos Assets ? Apprenez à rechercher dans la hiérarchie comme un pro ou rechercher ses assets de projet avec style.

Si ce tutoriel vous appris des trucs, n’hésitez pas à le partager à vos amis !

Laisser un commentaire

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