Mostrar Cuando – PropertyDrawer



Qué vamos a ver

Como dijimos en el post del atributo Interval Range, los Property Drawers son potentes herramientas que nos permiten modificar la funcionalidad o el cómo se visualizan los elementos en el inspector.

Hoy mostraremos un atributo para mostrar u ocultar campos en función de ciertas condiciones. Muy útil para minimizar la información que se muestra en el componente y eliminar la que no es necesaria en ese momento.



Programas necesarios

Podemos usar cualquier versión de Unity y nuestro editor de código preferido.

Entrando en materia

Como vimos en el caso anterior, empezaremos por la clase que nos sirve para definir los constructores:

Como podemos ver en los constructores, todos los campos con los que vamos a comparar se los pasamos mediante el nombre de la variable. Tenemos un primer constructor que solo usaremos cuando queramos comparar con bool, un segundo que nos sirve para el resto, y un tercero para casos especiales donde una variable se pueda mostrar en función de varios valores de un enumerado.

A continuación vemos una versión reducida de la clase que pintará o no la variable en el editor, en este caso de la parte de comparación con un valor booleano.

En primer lugar nos aseguramos que nos pasan una variable correcta. A continuación aseguramos que el valor que nos pasan para comparar es del mismo tipo y guardamos en la variable “showField” el resultado de la comparación. Si esta variable tiene el valor falso, no pintaremos el campo correspondiente.

Pero esto no es suficiente ya que entonces quedarían huecos blancos grandes, por lo que debemos sobreescribir como vemos el método “GetPropertyHeight” que define la altura del campo para que luego se pinte en el inspector. En caso de que la variable antes mencionada “showField” sea verdadera, devolvemos la altura de la propiedad correspondiente, pero si es falsa, le quitamos el espacio vertical que suele añadir el inspector por defecto.

Este atributo nos presenta dos problemas:

1.- Por un lado, por la forma que tiene Unity de gestionar  los Arrays, si usamos un Array puro nos encontraremos el siguiente problema al ocultarlo.

Como podemos ver, aunque no se muestra el contenido del array, nos sigue pintando el desplegable y el tamaño.

Si queremos buscar una solución a esto, usamos una clase para encapsular dicho Array y entonces nos ocultará por completo el array.

2.- Por otro lado, por la forma que tiene Unity de gestionar los Property Drawers, solo es capaz de pintar uno a la vez, por lo tanto si por ejemplo le aplicamos un atributo “Interval Range” y este, en función del orden que lo añadamos dejará de funcionar o uno u otro, como podemos ver en el ejemplo a continuación:

Como podemos ver no se muestra el Slider del atributo intervalo, porque está sobreescrito por el atributo “Show When”. Buscaremos una solución a esta problemática  en un post posterior.

Por último y como siempre, el código completo se puede descargar aquí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *