Resumen

Controlar visualmente el movimiento de un personaje en la escena de Unity sin tener que seleccionar cada pieza por separado es posible gracias a los handles. A diferencia de los gizmos tradicionales, los handles permiten recibir inputs del usuario, lo que significa que puedes arrastrarlos, rotarlos y modificar posiciones directamente desde la vista de escena. Esto abre la puerta a flujos de trabajo mucho más ágiles cuando necesitas editar rutas, rigs o cualquier elemento interactivo.

¿Qué diferencia a los handles de los gizmos?

Los gizmos son representaciones visuales estáticas que sirven para depuración y visualización, pero no aceptan interacción directa. Los handles, en cambio, funcionan como controles interactivos: puedes crear tus propios manipuladores de posición o rotación, similares a los que Unity usa por defecto [0:28].

Un ejemplo práctico: imagina un personaje con un brazo y una pierna que necesitas ajustar constantemente. Sin handles, tendrías que ir pieza por pieza en la jerarquía. Con handles, puedes manipular todo desde la misma vista del rig sin buscar cada componente individual.

¿Cómo dibujar líneas punteadas entre waypoints?

El ejercicio parte de un personaje zombie que se desplaza de forma periódica entre una lista de transforms llamados waypoints [2:15]. El zombie recorre la lista en orden y luego regresa, pero sin una representación visual resulta difícil entender su trayectoria.

Para dibujar el camino, se trabaja dentro de OnSceneGUI en un custom editor, no en la sección de gizmos. La razón es que los handles necesitan este contexto para procesar inputs correctamente [2:50].

¿Cómo se construye el recorrido visual?

  • Se itera sobre la lista de waypoints con un for clásico.
  • Para cada waypoint se obtiene el siguiente usando el operador módulo, lo que garantiza que al llegar al último vuelva al primero sin salir del rango del array [3:30].
  • Se valida que ningún waypoint sea nulo antes de dibujar, evitando crashes inesperados.
  • Se utiliza Handles.DrawDottedLine pasando las dos posiciones y un valor de screen space size de cinco para controlar la densidad del punteado [4:20].
  • El color se establece con Handles.color = Color.white para que resalte en la escena.

Al regresar al editor, el trazo punteado ya muestra claramente la ruta que seguirá el zombie.

¿Cómo agregar controles de posición editables?

Para facilitar la edición de cada punto sin entrar en la jerarquía, se dibuja primero una esfera pequeña con Handles.DrawSphere en la posición del waypoint con un radio de 0.1, coloreada en amarillo [5:40].

Luego se usa Handles.PositionHandle, que replica el mismo manipulador de posición que Unity utiliza internamente. Este método recibe la posición y la rotación del waypoint, y retorna un Vector3 con la nueva posición si el usuario lo arrastra [6:00]. Solo resta asignar esa nueva posición al transform del waypoint.

Un detalle importante: los gizmos de tipo DrawSphere no pueden dibujarse dentro de OnSceneGUI. La solución es moverlos al método OnDrawGizmosSelected dentro del MonoBehaviour del zombie, iterando con un foreach por todos los waypoints [6:50].

¿Cómo registrar cambios para el sistema de undo?

Al mover los handles, Unity no registra automáticamente las modificaciones en su sistema de deshacer. Si presionas Ctrl+Z, no ocurre nada. Para resolverlo se utilizan dos herramientas clave [8:10]:

  • EditorGUI.BeginChangeCheck indica a Unity que comience a vigilar cambios.
  • EditorGUI.EndChangeCheck retorna true cuando detecta que algo se modificó, funcionando de manera similar a un botón de GUI.

Cuando el cambio se confirma, antes de asignar la nueva posición se llama a Undo.RecordObject pasando el waypoint y un nombre descriptivo como "Move Waypoint" [9:00]. Este nombre aparece en el menú Edit > Undo, permitiendo deshacer y rehacer cada movimiento individual de forma limpia.

Con todo integrado, al dar play el zombie recorre su ruta visible, y en modo edición puedes arrastrar cualquier waypoint con total libertad, sabiendo que cada cambio queda registrado y es reversible.

¿Has experimentado creando handles personalizados de rotación o escala? Comparte tu experiencia y cómo los has aplicado en tus proyectos.