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

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
megablast2
Messages : 152
Inscription : 15 Août 2013 16:47

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

Message par megablast2 » 10 Oct 2021 18:49

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);
        }
    }

megablast2
Messages : 152
Inscription : 15 Août 2013 16:47

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

Message par megablast2 » 11 Oct 2021 20:19

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?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6178
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 12 Oct 2021 08:14

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.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Unity le logiciel »