Jump to content
Sign in to follow this  
Feider

EditorGUI Agrupar propiedades.

Recommended Posts

Buenos días:

Me encuentro en un camino sin salida ¿O tal vez estoy viajando por el lugar equivocado? Pero no logro encontrar solución a mi problema:

Disponemos de una clase serializada con tres parámetros: Nombre, precio y cantidad.

La cosa es que queremos que nombre aparezca arriba y cantidad y precio debajo en la misma linea. 

Deseofallo.PNG

Pero este es el resultado... Y nosotros buscamos algo más así.

deso2.PNG

Pero puesto de la forma de arriba... No logro atinar con la forma de hacerlo... ¿o quizá no es posible o no es buena idea?

 

Un saludo.

 

Share this post


Link to post
Share on other sites

Hola, estaria bueno que subas el codigo para poder ver un poco mas, no se porque queda tan pero tan feo. El serializar la clase no deberia cambiar mucho, y automaticamente los public's son campos serializados.

Si queres podes usar un customInspector para poder personalizar todo a gusto.Para agrupar las cosas como quieras usa los Begin/EndHorizontal y Begin/EndVertical, en tu caso seria:

GUILayout.BeginHorizontal();
GUILayout.Label ("Nomrbe"); 
nombreTextField = EditorGUILayout.TextField(nombreTextField);//Text Field para el nombre
EndHorizontal();

BeginHorizontal();
GUILayout.Label ("Slider1"); 
//slider1 ...
EndHorizontal();

BeginHorizontal();
GUILayout.Label ("Slider2"); 
//slider2 ...
EndHorizontal();

 

Share this post


Link to post
Share on other sites

Le echaré un vistazo.  Eso lo he colocado en el OnGUI de la clase. (heredada del Editor que recibe un rect de posición, un GUIlayout y... otra cosa , ahora de cabeza no caigo)  Lo único que hago es extraer las propiedades, crear los rect de posición y ordenar que ponga los parámetros.

En cuanto pueda vuelvo a simular el código ya que ahora mismo no dispongo del original y no tengo mucho tiempo.  

 

Muchas gracias.

Share this post


Link to post
Share on other sites
7 hours ago, Feider said:

Le echaré un vistazo.  Eso lo he colocado en el OnGUI de la clase. (heredada del Editor que recibe un rect de posición, un GUIlayout y... otra cosa , ahora de cabeza no caigo)  Lo único que hago es extraer las propiedades, crear los rect de posición y ordenar que ponga los parámetros.

En cuanto pueda vuelvo a simular el código ya que ahora mismo no dispongo del original y no tengo mucho tiempo.  

 

Muchas gracias.

Si usas GUILayout la ventaja que tenes que es todo supuesto rect ya se calcula solo, no es lo mismo que GUI.

Cuando haces un customInspector no usas OnGUI, se utiliza OnInspectorGUI, tenes que hacerle override:

public override void OnInspectorGUI ()
{
	//...
}

Si no la llenas no se dibuja nada, (ni siquiera el casillero del script), si queres que se dibuje todo como antes le pones DrawDefaultInspector o algo por el estilo.

Share this post


Link to post
Share on other sites

Oh... Y yo pensando que era buena idea el OnGUI. '-,...,-, Gracias. Cambiaré mi modus operandi. A ver qué sale ^,...,^ (Aún no he tenido tiempo, pero veo que ya no es necesario que pegue el script). Intentaré publicar un resultado cuando pueda por si aparece alguien más con el mismo problema. (Aunque aún tardaré algunos días, que ando liado). 

Share this post


Link to post
Share on other sites
On 2017-6-2 at 18:22, lightbug said:

Si usas GUILayout la ventaja que tenes que es todo supuesto rect ya se calcula solo, no es lo mismo que GUI.

Cuando haces un customInspector no usas OnGUI, se utiliza OnInspectorGUI, tenes que hacerle override:


public override void OnInspectorGUI ()
{
	//...
}

Si no la llenas no se dibuja nada, (ni siquiera el casillero del script), si queres que se dibuje todo como antes le pones DrawDefaultInspector o algo por el estilo.

Por fin pude acceder al ordenador.

Esto es el código que tenemos:

-------------------------------------------------------------------------

[System.Serializable]
public class Ingrediente
{
    public string Nombre;
    [Range(, 9999)]
    public float Precio;
    [Range(, 999)]
    public int Cantidad;
}

[ExecuteInEditMode]
[CustomPropertyDrawer(typeof(Ingrediente))]
public class IngredienteDibujar : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        EditorGUI.BeginProperty(position, label, property);
        position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
        int sangria = EditorGUI.indentLevel;
        EditorGUI.indentLevel = ;

        float laMitadX = Mathf.RoundToInt(position.width / 2);
        Rect nombreRect = new Rect(position.x, position.y, position.width, 16);
        Rect precioRect = new Rect(position.x, position.y + 16, laMitadX, position.height);
        Rect cantidadesRect = new Rect(position.x + laMitadX, position.y + 16, laMitadX, position.height);

        EditorGUI.PropertyField(nombreRect, property.FindPropertyRelative("Nombre"), GUIContent.none);
        EditorGUI.PropertyField(precioRect, property.FindPropertyRelative("Precio"), GUIContent.none);
        EditorGUI.PropertyField(cantidadesRect, property.FindPropertyRelative("Cantidad"), GUIContent.none);

        EditorGUI.indentLevel = sangria;
        EditorGUI.EndProperty();
    }
}

------------------------------------------------------------------------

Nuestro objetivo es hacer que esas propiedades sean parte de un desplegable...

 

Probamos a intentar con otra clase en el editor que afectara a eso, pero no hace nada... (m''' ¿Será que no entendimos bien la documentación?)

 

Un saludo.

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

Bueno, por fin creo que di con la respuesta, creo que hay formas mejores de hacerlo. Pero seguro a alguien puede servirle.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[System.Serializable]
public class Ingrediente
{
    public const float PRECIO_MAXIMO = 9999f;
    public const int CANTIDAD_MAXIMA = 999;
    public const int CARACTERES_MAXIMOS = 30;

    public string Nombre;
    //[Range(0,9999)]
    public float Precio;
    //[Range(0, 999)]
    public int Cantidad;

    public override string ToString()
    {
        return Nombre;
    }
}

[ExecuteInEditMode]
[CustomPropertyDrawer(typeof(Ingrediente))]
public class IngredienteDibujar : PropertyDrawer
{
    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        return base.GetPropertyHeight(property, label) + (EditorGUIUtility.singleLineHeight * 2);
    }

    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        EditorGUI.BeginProperty(position, label, property);


        SerializedProperty pNombre = property.FindPropertyRelative("Nombre");
        SerializedProperty pPrecio = property.FindPropertyRelative("Precio");
        SerializedProperty pCantidad = property.FindPropertyRelative("Cantidad");


        //Es mejor que cada propiedad sepa si "ha sido expandida" o no ya que las variables globales se aplican a todos los elementos.
        property.isExpanded = EditorGUI.Foldout(new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight), property.isExpanded, label);

        
        float laMitadX = Mathf.RoundToInt(position.width / 2);
        int margenNombre = 50;
        int margenPrecio = 50;
        int margenCantidad = 60;

        //Calculo las dimensiones de cada parte
        Rect nombreRect = new Rect(position.x + margenNombre, position.y + EditorGUIUtility.singleLineHeight, position.width - margenNombre, EditorGUIUtility.singleLineHeight);
        Rect precioRect = new Rect(position.x + margenPrecio, position.y + EditorGUIUtility.singleLineHeight * 2, laMitadX - margenPrecio, EditorGUIUtility.singleLineHeight);
        Rect cantidadesRect = new Rect(position.x + laMitadX - 20 + margenCantidad, position.y + EditorGUIUtility.singleLineHeight * 2, laMitadX - margenCantidad + 20, EditorGUIUtility.singleLineHeight);
       
        //Y dibujo las cosas en caso de que si esté expandido, o las oculto si no.
        if (property.isExpanded)
        {
            //Etiquetas para dar nombre
            EditorGUI.LabelField(new Rect(nombreRect.x - margenNombre, nombreRect.y, 100, position.height), "Nombre");
            EditorGUI.LabelField(new Rect(precioRect.x - margenPrecio, precioRect.y, 100, position.height), "Precio");
            EditorGUI.LabelField(new Rect(cantidadesRect.x - margenCantidad, cantidadesRect.y, 100, position.height), "Cantidad");
            //Propiedades
            EditorGUI.PropertyField(nombreRect, pNombre, GUIContent.none);
            EditorGUI.PropertyField(precioRect, pPrecio, GUIContent.none);
            EditorGUI.PropertyField(cantidadesRect, pCantidad, GUIContent.none);
            //Control de los valores, se pueden usar los ranges pero por embellecimiento lo haré aquí. 
            if (pNombre.stringValue.Length > Ingrediente.CARACTERES_MAXIMOS) pNombre.stringValue = pNombre.stringValue.Substring(, Ingrediente.CARACTERES_MAXIMOS);
            pPrecio.floatValue = Mathf.Clamp(pPrecio.floatValue, 0f, Ingrediente.PRECIO_MAXIMO);
            pCantidad.intValue = Mathf.Clamp(pCantidad.intValue, , Ingrediente.CANTIDAD_MAXIMA);

        }

        EditorGUI.EndProperty();

    }

}

 

Un saludo ^^

P.D: Tal como lo tengo queda un poco feo ya que no logré ajustar los saltos de línea de forma inteligente. Probaré otro camino en el futuro. 

 

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...