Per accelerare lo sviluppo di applicazioni, crea editor personalizzati per i componenti che usi comunemente. Questa pagina mostra come creare un semplice script per creare GameObjectsL’oggetto fondamentale nelle scene di Unity, che può rappresentare personaggi, oggetti di scena, scenari, telecamere, waypoint e altro. La funzionalità di un GameObject è definita dai componenti ad esso collegati. Maggiori informazioni
Vedi nel Glossario guardare sempre un punto.
- Crea uno script C# e chiamalo “”LookAtPoint”.
- Apri lo script e sostituisci il suo contenuto con il codice che segue.
- Attacca lo script a un GameObject nella tua ScenaUna Scena contiene gli ambienti e i menu del tuo gioco. Pensate ad ogni file Scene come ad un livello unico. In ogni scena, metti i tuoi ambienti, ostacoli e decorazioni, essenzialmente progettando e costruendo il tuo gioco a pezzi. Maggiori informazioni
Vedi nel Glossario.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Quando entri in modalità Play, il GameObject a cui hai collegato lo script ora si orienta verso le coordinate che hai impostato nella proprietà “Look At Point”. Quando scrivi gli script dell’editorUn pezzo di codice che ti permette di creare i tuoi componenti, attivare eventi di gioco, modificare le proprietà dei componenti nel tempo e rispondere all’input dell’utente in qualsiasi modo tu voglia. Maggiori informazioni
Vedi nel Glossario, è spesso utile far eseguire certi script durante la modalità Edit, mentre la tua applicazione non è in esecuzione. Per farlo, aggiungi l’attributo ExecuteInEditMode
alla classe, in questo modo:
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Ora se sposti il GameObject nell’Editor, o cambi i valori di “Look At Point” nell’InspectorUna finestra di Unity che mostra informazioni sul GameObject attualmente selezionato, sulla risorsa o sulle impostazioni del progetto, permettendoti di controllare e modificare i valori. Maggiori informazioni
Vedi nel Glossario, il GameObject aggiorna la sua rotazione in modo che guardi il punto di destinazione nello spazio del mondo.
Creare un Editor personalizzato
Quanto sopra dimostra come puoi far girare semplici script durante il tempo di modifica, tuttavia questo da solo non ti permette di creare i tuoi strumenti Editor. Il prossimo passo è quello di creare un Editor personalizzato per lo script appena creato.
Quando si crea uno script in Unity, per default eredita da MonoBehaviour, e quindi è un componente che si può attaccare a un GameObject. Quando metti un componente su un GameObject, l’Inspector mostra un’interfaccia predefinita che puoi usare per visualizzare e modificare ogni variabile pubblica, per esempio: un intero, un float o una stringa.
Questo è l’aspetto predefinito dell’Inspector per il componente LookAtPoint:
Un editor personalizzato è uno script separato che sostituisce questo layout predefinito con qualsiasi controllo editor che scegliete.
Per creare l’editor personalizzato per lo script LookAtPoint:
- Crea un nuovo script C# e chiamalo “LookAtPointEditor”.
- Apri lo script e sostituisci il suo contenuto con il codice seguente.
//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(); }}
Questa classe deve ereditare da Editor. L’attributo CustomEditor informa Unity per quale componente dovrebbe fungere da editor. L’attributo CanEditMultipleObjects dice a Unity che puoi selezionare più oggetti con questo editor e cambiarli tutti allo stesso tempo.
Unity esegue il codice in OnInspectorGUI e visualizza l’editor nell’Inspector. Puoi mettere qualsiasi codice GUI qui dentro e funziona allo stesso modo di OnGUI, ma viene eseguito all’interno dell’Inspector. Editor definisce la proprietà di destinazione che potete usare per accedere al GameObject che state ispezionando.
Ecco come appare l’Inspector per il componente LookAtPoint con il nuovo editor:
Questo sembra molto simile (anche se il campo “Script” ora non è presente, perché lo script dell’editor non aggiunge alcun codice Inspector per mostrarlo).
Tuttavia, ora che hai il controllo su come l’Inspector viene visualizzato in uno script Editor, puoi usare qualsiasi codice tu voglia per disporre i campi dell’Inspector, permettere all’utente di regolare i valori, e persino mostrare grafici o altri elementi visivi. In effetti tutti gli Inspector che vedi all’interno dell’Editor di Unity, compresi gli Inspector più complessi come il terrenoIl paesaggio nella tua scena. Un GameObject Terrain aggiunge un grande piano piatto alla tua scena e puoi usare la finestra dell’Ispettore Terrain per creare un paesaggio dettagliato. Maggiori informazioni
Vedi nel Glossario le impostazioni di sistema e di importazione delle animazioni, sono tutte fatte usando la stessa API a cui hai accesso quando crei i tuoi editor personalizzati.
Ecco un semplice esempio che estende lo script del tuo editor per mostrare un messaggio che indica se il punto di destinazione è sopra o sotto il 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)"); } }}
Ecco come appare l’Inspector per il componente LookAtPoint con il messaggio che mostra se il punto di destinazione è sopra o sotto il GameObject.
Hai pieno accesso a tutti i comandi IMGUI per disegnare qualsiasi tipo di interfaccia, incluso il renderingIl processo di disegno della grafica sullo schermo (o su una texture di rendering). Per impostazione predefinita, la telecamera principale in Unity rende la sua vista sullo schermo. Maggiori informazioni
Vedi in Glossario Scene che utilizzano una CameraUn componente che crea un’immagine di un particolare punto di vista nella tua scena. L’output è disegnato sullo schermo o catturato come texture. Maggiori informazioni
Vedi nel Glossario all’interno delle finestre dell’Editor.
Addizioni alla Vista Scena
Puoi aggiungere codice extra alla Vista ScenaUna vista interattiva del mondo che stai creando. Si usa la Vista Scena per selezionare e posizionare scenari, personaggi, telecamere, luci e tutti gli altri tipi di oggetti di gioco. Maggiori informazioni
Vedi nel Glossario. Per fare questo, implementa OnSceneGUI nel tuo editor personalizzato.
OnSceneGUI funziona proprio come OnInspectorGUI, tranne che viene eseguito nella vista Scena. Per aiutarvi a creare i vostri controlli di editing, potete usare le funzioni definite nella classe Handles. Tutte le funzioni lì dentro sono progettate per lavorare nelle viste Scena 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(); } }}
Se vuoi aggiungere oggetti GUI 2D (per esempio: GUI o EditorGUI), devi avvolgerli nelle chiamate a Handles.BeginGUI() e Handles.EndGUI().