Page 1 sur 1

[UnityEditor] Demande de conseil sur la manière de faire

Publié : 10 Oct 2021 18:49
par megablast2
Bonsoir,

J'essai en mettre en forme un petit interface dans l'inspecteur d'Unity. Il comprend des entrées de type float (Life, Energy, Hunger, decreaseFood, decreaseRate) et des UnityEvents (changeLife, changeEnergy, changeHungry, gameStart, gameOver). L'idée c'est de faire une rangé des floats d'abord suivit de deux fenêtres ouvrables contenant les unityEvent (une pour celle qui ne reçoivent pas d’argument et une autre pour celle qui en reçoivent). J'ai testé le code avant de faire ça et tout marche (c'est tiré d'un tuto que j'avais suivis que j’essaie de refaire avec des Unityevents).

Le problème c'est que je mets tout ensemble, seul les floats s'affiche. Si je les enlève (pas toute, juste la dernière sur les trois présentes dans la méthode OnInspectorGUI()) les UnityEvents réapparaissent. Dans tout les cas, je ne peux pas utiliser les sliders, ni les unityEvents (sauf le tout dernier qui marche). Pourriez vous m'éclairer sur ce problème? Merci d'avance.

Code : Tout sélectionner

using UnityEditor;

[CustomEditor(typeof(GameManager))]
public class GameManager_Inspector : Editor
{
    SerializedProperty Life, Energy, Hunger, decreaseFood, decreaseRate;

    SerializedProperty changeLife, changeEnergy, changeHungry;
    SerializedProperty gameStart, gameOver;

    bool showEvtVoid, showEvt = false;

    private void OnEnable()
    {
        Life = serializedObject.FindProperty("Life");
        Energy = serializedObject.FindProperty("Energy");
        Hunger = serializedObject.FindProperty("Hunger");
        decreaseFood = serializedObject.FindProperty("decreaseFood");
        decreaseRate = serializedObject.FindProperty("decreaseRate");

        changeLife = serializedObject.FindProperty("changeLife");
        changeEnergy = serializedObject.FindProperty("changeEnergy");
        changeHungry = serializedObject.FindProperty("changeHungry");

        gameStart = serializedObject.FindProperty("gameStart");
        gameOver = serializedObject.FindProperty("gameOver");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.Slider(Life,0,100);
        EditorGUILayout.Slider(Energy, 0, 100);
        EditorGUILayout.Slider(Hunger, 0, 100);

        showEvt = EditorGUILayout.Foldout(showEvt, "UnityEvent<> (List)");

        if (showEvt)
        {
            EditorGUILayout.PropertyField(changeLife);
            EditorGUILayout.PropertyField(changeEnergy);
            EditorGUILayout.PropertyField(changeHungry);
        }

        showEvtVoid = EditorGUILayout.Foldout(showEvtVoid, "UnityEvent (List)");

        if (showEvtVoid)
        {
            EditorGUILayout.PropertyField(gameStart);
            EditorGUILayout.PropertyField(gameOver);
        }
    }

Re: [UnityEditor] Demande de conseil sur la manière de faire

Publié : 11 Oct 2021 20:19
par megablast2
J'ai trouvé une solution pour faire une fenêtre rétractable en sérialisant les UnityEvents.

Code : Tout sélectionner

using UnityEngine;
//using System;
using UnityEngine.Events;

[System.Serializable]

public class CustomUnityEvtFloat
{
    [SerializeField] private UnityEvent<float> changeLife, changeEnergy, changeHungry;
}

[System.Serializable]

public class CustomUnityEvt
{
    [SerializeField] private UnityEvent gameStart, gameOver;
}
Par contre la classe Gamemanager ne détecte pas les UnityEvent qu'elles contiennent au sein de la classe. Y'a t'il un moyen d'indiquer a Gamemanager que ces unityEvent existent?

Re: [UnityEditor] Demande de conseil sur la manière de faire

Publié : 12 Oct 2021 08:14
par boubouk50
Tes UnityEvents sont privés, ils ne sont donc pas accessibles en dehors du scope de la classe.
Il faut qu'ils soient publics voire statics.