Para acelerar el desarrollo de aplicaciones, cree editores personalizados para los componentes que utiliza habitualmente. Esta página le muestra cómo crear un simple script para hacer GameObjectsEl objeto fundamental en las escenas de Unity, que puede representar personajes, props, escenarios, cámaras, waypoints, y más. La funcionalidad de un GameObject es definida por los Componentes adjuntos a él. Más información
Ver en Glosario mirar siempre a un punto.
- Crea un script en C# y nómbralo «»LookAtPoint».
- Abre el script y sustituye su contenido por el código que aparece a continuación.
- Ajunta el script a un GameObject de tu EscenaUna Escena contiene los entornos y menús de tu juego. Piensa en cada archivo de Escena único como un nivel único. En cada Escena, colocas tus entornos, obstáculos y decoraciones, esencialmente diseñando y construyendo tu juego en piezas. Más información
Ver en el Glosario.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Cuando entras en el modo de juego, el GameObject al que has adjuntado el script se orienta ahora hacia las coordenadas que has establecido en la propiedad «Look At Point». Al escribir los scripts del EditorUna pieza de código que le permite crear sus propios Componentes, desencadenar eventos del juego, modificar las propiedades del Componente en el tiempo y responder a la entrada del usuario de la manera que desee. Más información
Ver en el Glosario, a menudo es útil hacer que ciertos scripts se ejecuten durante el modo Edición, mientras su aplicación no se está ejecutando. Para hacer esto, añada el atributo ExecuteInEditMode
a la clase, así:
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Ahora si mueve el GameObject en el Editor, o cambia los valores de «Look At Point» en el InspectorUna ventana de Unity que muestra información sobre el GameObject actualmente seleccionado, el activo o la configuración del proyecto, permitiéndole inspeccionar y editar los valores. Más información
Ver en el Glosario, el GameObject actualiza su rotación para que mire al punto de destino en el espacio del mundo.
Creando un Editor Personalizado
Lo anterior demuestra cómo puede obtener scripts simples que se ejecutan durante el tiempo de edición, sin embargo esto solo no le permite crear sus propias herramientas de Editor. El siguiente paso es crear un Editor Personalizado para el script que acaba de crear.
Cuando usted crea un script en Unity, por defecto hereda de MonoBehaviour, y por lo tanto es un componente que usted puede adjuntar a un GameObject. Cuando usted coloca un componente en un GameObject, el Inspector muestra una interfaz por defecto que usted puede utilizar para ver y editar cada variable pública, por ejemplo: un entero, un flotador, o una cadena.
Así es como se ve por defecto el Inspector del componente LookAtPoint:
Un editor personalizado es un script separado que reemplaza este diseño por defecto con los controles del editor que usted elija.
Para crear el editor personalizado para el script LookAtPoint:
- Cree un nuevo script en C# y nómbrelo «LookAtPointEditor».
- Abra el script y reemplace su contenido con el código que aparece a continuación.
//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor { SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); serializedObject.ApplyModifiedProperties(); }}
Esta clase debe heredar de Editor. El atributo CustomEditor informa a Unity para qué componente debe actuar como editor. El atributo CanEditMultipleObjects le dice a Unity que puede seleccionar múltiples objetos con este editor y cambiarlos todos al mismo tiempo.
Unity ejecuta el código en OnInspectorGUI muestra el editor en el Inspector. Usted puede poner cualquier código GUI aquí y funciona de la misma manera que OnGUI hace, pero se ejecuta dentro del Inspector. Editor define la propiedad de destino que puede utilizar para acceder al GameObject que está inspeccionando.
Así es como se ve el Inspector para el componente LookAtPoint con el nuevo editor:
Esto se ve muy similar (aunque el campo «Script» ahora no está presente, porque el script del editor no añade ningún código del Inspector para mostrarlo).
Sin embargo, ahora que tiene el control sobre cómo se muestra el Inspector en un script del Editor, puede utilizar cualquier código que desee para disponer los campos del Inspector, permitir al usuario ajustar los valores, e incluso mostrar gráficos u otros elementos visuales. De hecho todos los Inspectores que usted ve dentro del Editor de Unity incluyendo los Inspectores más complejos como el terrenoEl paisaje en su escena. Un Terrain GameObject agrega un gran plano a su escena y usted puede utilizar la ventana del Inspector del Terrain para crear un paisaje detallado. Más información
Ver en el Glosario los ajustes del sistema y de la importación de la animación, se hacen todos usando la misma API a la que tienes acceso cuando creas tus propios Editores personalizados.
Aquí hay un ejemplo simple que extiende tu script de editor para mostrar un mensaje que indica si el punto objetivo está por encima o por debajo del GameObject:
//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor{ SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); serializedObject.ApplyModifiedProperties(); if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Above this object)"); } if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Below this object)"); } }}
Así es como se ve el Inspector para el componente LookAtPoint con el mensaje que muestra si el punto objetivo está por encima o por debajo del GameObject.
Tienes acceso completo a todos los comandos de IMGUI para dibujar cualquier tipo de interfaz, incluyendo el renderizadoEl proceso de dibujar gráficos a la pantalla (o a una textura de renderizado). Por defecto, la cámara principal en Unity renderiza su vista a la pantalla. Más información
Ver en el Glosario Escenas que utilizan una cámaraUn componente que crea una imagen de un punto de vista particular en su escena. La salida se dibuja en la pantalla o se captura como una textura. Más información
Ver en el Glosario dentro de las ventanas del Editor.
Adiciones a la Vista de Escena
Puedes añadir código extra a la Vista de EscenaUna vista interactiva del mundo que estás creando. Usted utiliza la Vista de Escena para seleccionar y posicionar el escenario, los personajes, las cámaras, las luces y todos los demás tipos de Objetos de Juego. Más información
Ver en el Glosario. Para hacer esto, implemente OnSceneGUI en su editor personalizado.
OnSceneGUI funciona igual que OnInspectorGUI excepto que se ejecuta en la vista de la escena. Para ayudarte a crear tus propios controles de edición, puedes utilizar las funciones definidas en la clase Handles. Todas las funciones están diseñadas para trabajar en vistas de Escena 3D.
//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor{ SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Above this object)"); } if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Below this object)"); } serializedObject.ApplyModifiedProperties(); } public void OnSceneGUI() { var t = (target as LookAtPoint); EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Move point"); t.lookAtPoint = pos; t.Update(); } }}
Si quieres añadir objetos GUI 2D (por ejemplo: GUI o EditorGUI), necesitas envolverlos en llamadas a Handles.BeginGUI() y Handles.EndGUI().