Info Attribute

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
EmileF
Messages : 428
Inscription : 18 Mars 2017 19:39

Info Attribute

Message par EmileF » 29 Nov 2019 10:33

Bonjour,

Désolé si je ne suis pas dans la bonne rubrique, je n'ai pas su où mettre mon post.

J'ai trouvé un truc qui m'a paru très utile et que j'ai voulu partagé.

Il s'agit d'un attribut qui permet d'afficher dans l'Inspector une explication, un conseil ou autre.

Voilà le script de l'Attribut lui même:

Code : Tout sélectionner

public enum InfoType { None, Info, Warning, Error }

public class InfoAttribute : PropertyAttribute
{
    public string text;
    public InfoType infoType;

    public InfoAttribute(string text, InfoType infoType = InfoType.Info)
    {
        this.text = text;
        this.infoType = infoType;
    }
}
Voilà le script à mettre dans un dossier Editor:

Code : Tout sélectionner

using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(InfoAttribute))]
public class InfoAttributeDrawer : DecoratorDrawer
{
    public override float GetHeight()
    {
        var infoAttribute = attribute as InfoAttribute;
        if (infoAttribute == null) return base.GetHeight();
        var infoStyle = (GUI.skin != null) ? GUI.skin.GetStyle("info") : null;
        if (infoStyle == null) return base.GetHeight();
        return Mathf.Max(40f, infoStyle.CalcHeight(new GUIContent(infoAttribute.text), EditorGUIUtility.currentViewWidth) + 4);
    }

    public override void OnGUI(Rect position)
    {
        var infoAttribute = attribute as InfoAttribute;
        if (infoAttribute == null) return;
        EditorGUI.HelpBox(position, infoAttribute.text, GetMessageType(infoAttribute.infoType));
    }

    private MessageType GetMessageType(InfoType infoType)
    {
        switch (infoType)
        {
            default:
            case InfoType.None: return MessageType.None;
            case InfoType.Info: return MessageType.Info;
            case InfoType.Warning: return MessageType.Warning;
            case InfoType.Error: return MessageType.Error;
        }
    }
}

et voilà un exemple d'utilisation:

Code : Tout sélectionner

    [Info("Le parent de l'objet, son image dans l'inventaire")]
    [Space(20)]
    public Transform Parent;
    public Sprite Item;
    public Inventaire Inventaire;
    public bool AStocker;
    public bool APlacer;
La ligne : "[Space(20)]" permet de créer un espace avant la zone d'explication contrairement à ce qu'on pourrait penser.

petit truc supplémentaire

Code : Tout sélectionner

        [Multiline]
        public string Explication;
permet aussi d'afficher une zone d'explication et modifier le "Element 0", "Element 1" d'un List. C'est sympa aussi

En espérant avoir été utile
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Scripts »