Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

EditorGUI Agrupar propiedades.

Iniciado por Feider, Junio 01, 2017, 01:46:45 PM

Tema anterior - Siguiente tema
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. 
 

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

 
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.
 
 

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

 
 

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.

Cita de: Feider date=1496418366Le 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.

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). 

Junio 07, 2017, 01:26:53 PM #5 Ultima modificación: Junio 07, 2017, 10:09:03 PM por pioj
Cita de: lightbug date=1496420524Si 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.

Junio 08, 2017, 11:02:17 AM #6 Ultima modificación: Junio 08, 2017, 08:05:39 PM por pioj
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 Unit***itor;
[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. 
 
 

Etiquetas: