Para acelerar o desenvolvimento de aplicações, crie editores personalizados para componentes que você normalmente usa. Esta página mostra como criar um script simples para fazer o GameObjectsO objeto fundamental nas cenas da Unidade, que pode representar personagens, adereços, cenários, câmeras, waypoints, e muito mais. A funcionalidade de um GameObject é definida pelos Componentes anexados a ele. Mais informações
Ver no Glossário sempre olhe um ponto.
- Criar um script em C# e nomeá-lo “”LookAtPoint”.
- Abrir o script e substituir seu conteúdo pelo código abaixo.
- Acoplar o script a um GameObject em seu SceneA Scene contém os ambientes e menus do seu jogo. Pense em cada arquivo de Cena único como um nível único. Em cada Cena, você coloca seus ambientes, obstáculos, e decorações, essencialmente desenhando e construindo seu jogo em peças. Mais informações
Veja no Glossário.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Quando você entra no modo Play, o GameObject ao qual você anexou o script agora se orienta para as coordenadas que você definiu para a propriedade “Look At Point”. Ao escrever scripts de EditorUm pedaço de código que permite que você crie seus próprios Componentes, acione eventos do jogo, modifique as propriedades dos Componentes ao longo do tempo e responda à entrada do usuário da maneira que você quiser. Mais informação
Ver no Glossário, é muitas vezes útil fazer certos scripts serem executados durante o modo Editar, enquanto a sua aplicação não está a correr. Para fazer isso, adicione o atributo ExecuteInEditMode
à classe, assim:
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Agora se você mover o GameObject no Editor, ou alterar os valores de “Look At Point” na janela InspectorA Unity que exibe informações sobre o GameObject atualmente selecionado, ativos ou configurações do projeto, permitindo que você inspecione e edite os valores. Mais informações
Ver no Glossário, o GameObject atualiza sua rotação para que ele olhe o ponto de destino no espaço mundial.
Fazer um Editor Personalizado
O acima demonstra como você pode obter scripts simples rodando durante o tempo de edição, porém isso sozinho não permite que você crie suas próprias ferramentas do Editor. O próximo passo é criar um Editor Personalizado para o script que você acabou de criar.
Quando você cria um script em Unity, por padrão ele herda do MonoBehaviour, e portanto é um componente que você pode anexar a um GameObject. Quando você coloca um componente em um GameObject, o Inspetor exibe uma interface padrão que você pode usar para visualizar e editar cada variável pública, por exemplo: um inteiro, um float, ou uma string.
Esta é a aparência padrão do Inspector para o componente LookAtPoint:
Um editor personalizado é um script separado que substitui este layout padrão por qualquer controle de editor que você escolher.
Criar o editor personalizado para o script LookAtPoint:
- Criar um novo script C# e nomeá-lo “LookAtPointEditor”.
- Abrir o script e substituir o seu conteúdo pelo código abaixo.
//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 classe deve herdar do Editor. O atributo CustomEditor informa à Unity para qual componente ele deve atuar como um editor. O atributo CanEditMultipleObjects diz ao Unity que você pode selecionar vários objetos com este editor e alterá-los todos ao mesmo tempo.
Unity executa o código no OnInspectorGUI ele exibe o editor no Inspector. Você pode colocar qualquer código GUI aqui e ele funciona da mesma forma que o OnGUI, mas é executado dentro do Inspetor. O editor define a propriedade alvo que você pode usar para acessar o GameObject que você está inspecionando.
Esta é a aparência do Inspector para o componente LookAtPoint com o novo editor:
Esta aparência é muito semelhante (embora o campo “Script” agora não esteja presente, pois o script do editor não adiciona nenhum código Inspector para mostrá-lo).
No entanto, agora que você tem controle sobre como o Inspetor é exibido em um script do Editor, você pode usar qualquer código que você queira para dispor os campos do Inspetor, permitir que o usuário ajuste os valores, e até mesmo exibir gráficos ou outros elementos visuais. Na verdade, todos os Inspectores que vê dentro do Unity Editor incluem os Inspectores mais complexos, como o terrenoO cenário na sua cena. Um GameObject de Terreno adiciona um grande plano plano à sua cena e você pode usar a janela do Inspetor de Terreno para criar uma paisagem detalhada. Mais informações
Veja no sistema Glossário e configurações de importação de animação, são todos feitos usando a mesma API que você tem acesso ao criar seus próprios Editores personalizados.
Aqui está um exemplo simples que estende seu script editor para exibir uma mensagem que indica se o ponto de destino está acima ou abaixo do 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)"); } }}
Esta é a aparência do Inspetor para o componente LookAtPoint com a mensagem mostrando se o ponto de destino está acima ou abaixo do GameObject.
Você tem acesso total a todos os comandos do IMGUI para desenhar qualquer tipo de interface, incluindo renderingO processo de desenhar gráficos para a tela (ou para uma textura de renderização). Por padrão, a câmera principal em Unity renderiza sua visualização para a tela. Mais informações
Veja em Cenas do Glossário usando um componente CameraA que cria uma imagem de um determinado ponto de vista na sua cena. A saída é desenhada para a tela ou capturada como uma textura. Mais info
Veja no Glossário dentro das janelas do Editor.
Adicionamentos da Vista de Cena
Pode adicionar código extra à Vista de CenaUma vista interactiva para o mundo que está a criar. Você usa a Vista de Cena para selecionar e posicionar cenários, personagens, câmeras, luzes e todos os outros tipos de objetos de jogo. Mais informações
Ver no Glossário. Para fazer isso, implemente o OnSceneGUI em seu editor personalizado.
OnSceneGUI funciona exatamente como OnInspectorGUI, exceto que ele é executado na visão de cena. Para ajudar você a fazer seus próprios controles de edição, você pode usar as funções definidas na classe Handles. Todas as funções lá são projetadas para trabalhar em 3D Scene View.
//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(); } }}
Se você quiser adicionar objetos GUI 2D (por exemplo: GUI ou EditorGUI), você precisa envolvê-los em chamadas para Handles.BeginGUI() e Handles.EndGUI().