Az alkalmazásfejlesztés felgyorsítása érdekében hozzon létre egyéni szerkesztőket a gyakran használt komponensekhez. Ez az oldal megmutatja, hogyan hozhat létre egy egyszerű szkriptet a GameObjectsA Unity jelenetek alapvető objektuma, amely karaktereket, kellékeket, díszletet, kamerákat, útpontokat és egyebeket reprezentálhat. Egy GameObject funkcionalitását a hozzá csatolt komponensek határozzák meg. További információ
Lásd a Fogalomtárban mindig nézz egy pontra.
- Készíts egy C# szkriptet, és nevezd el “”LookAtPoint”-nak.
- Nyisd meg a szkriptet, és cseréld ki a tartalmát az alábbi kódra.
- A szkriptet csatold egy GameObjecthez a Scene-benA Scene tartalmazza a játékod környezetét és menüit. Gondolj úgy minden egyes egyedi Scene fájlra, mint egy egyedi szintre. Minden egyes Scene-ben elhelyezed a környezeteket, akadályokat és dekorációkat, lényegében darabokban tervezed és építed fel a játékodat. További információ
Lásd a szószedetben.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
A játékmódba lépve a GameObject, amelyhez a szkriptet csatoltad, most a “Look At Point” tulajdonságban beállított koordináták felé orientálódik. Szerkesztői szkriptek írásakorEgy kódrészlet, amely lehetővé teszi, hogy saját komponenseket hozzon létre, játékeseményeket indítson el, idővel módosítsa a komponensek tulajdonságait, és tetszőleges módon reagáljon a felhasználói bemenetre. További információ
Lásd a Fogalomtárban, gyakran hasznos, ha bizonyos szkripteket Szerkesztő módban futtathatsz, miközben az alkalmazásod nem fut. Ehhez adjuk hozzá az ExecuteInEditMode
attribútumot az osztályhoz, így:
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}
Most ha a GameObjectet mozgatjuk a szerkesztőben, vagy megváltoztatjuk a “Look At Point” értékeit az InspectorbanEgy Unity ablak, amely információkat jelenít meg az éppen kiválasztott GameObjectről, eszközről vagy projektbeállításokról, lehetővé téve az értékek vizsgálatát és szerkesztését. További információ
Lásd a szószedetben, a GameObject frissíti a forgását, hogy a világtérben a célpontot nézze.
Egyéni szerkesztő készítése
A fentiekben bemutattuk, hogyan lehet egyszerű szkripteket futtatni szerkesztés közben, azonban ez önmagában nem teszi lehetővé saját szerkesztőeszközök létrehozását. A következő lépés egy Custom Editor létrehozása az imént létrehozott szkripthez.
Mikor a Unityben létrehozol egy szkriptet, az alapértelmezés szerint a MonoBehaviourtól örököl, tehát egy olyan komponens, amelyet egy GameObjecthez csatolhatsz. Amikor egy komponenst egy GameObjectre helyezel, az Inspector egy alapértelmezett felületet jelenít meg, amelyet minden nyilvános változó, például egy egész szám, egy float vagy egy karakterlánc megtekintésére és szerkesztésére használhatsz.
A LookAtPoint komponens Inspectora alapértelmezés szerint így néz ki:
A saját szerkesztő egy külön szkript, amely ezt az alapértelmezett elrendezést az Ön által választott szerkesztő vezérlőelemekkel helyettesíti.
Egyéni szerkesztő létrehozása a LookAtPoint szkripthez:
- Készítsen egy új C# szkriptet, és nevezze el “LookAtPointEditor”-nak.
- Nyissa meg a szkriptet, és helyettesítse tartalmát az alábbi kóddal.
//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(); }}
Az osztálynak örökölnie kell az Editor osztályból. A CustomEditor attribútum tájékoztatja a Unity-t arról, hogy melyik komponens szerkesztőjeként működjön. A CanEditMultipleObjects attribútum azt mondja a Unitynek, hogy ezzel a szerkesztővel több objektumot is ki lehet jelölni és egyszerre lehet módosítani őket.
A Unity az OnInspectorGUI-ban lévő kódot hajtja végre, megjeleníti a szerkesztőt az Inspectorban. Ide bármilyen GUI kódot betehetsz, és az ugyanúgy működik, mint az OnGUI, de az Inspectoron belül fut. A Szerkesztő meghatározza a céltulajdonságot, amellyel elérheted a GameObjectet, amelyet vizsgálsz.
Így néz ki a LookAtPoint komponens Inspectora az új editorral:
Ez nagyon hasonlóan néz ki (bár a “Script” mező most nincs jelen, mert a szerkesztő script nem ad hozzá semmilyen Inspector kódot, hogy megjelenítse).
Valamint most, hogy a Szerkesztő szkriptben az Ellenőr megjelenítésének módja felett is rendelkezik, tetszőleges kódot használhat az Ellenőr mezőinek elrendezéséhez, lehetővé teszi a felhasználó számára az értékek beállítását, és akár grafikákat vagy más vizuális elemeket is megjeleníthet. Valójában a Unity Editorban látható összes Inspector, beleértve az összetettebb Inspectorokat is, mint például a terrainThe landscape a jelenetben. A Terrain GameObject egy nagy sík síkot ad a jelenethez, és a Terrain Inspector ablakát használhatja a részletes tájkép létrehozásához. További információ
Lásd a Glossary system and animation import settings, are all made using the same API that you have access to when creating your own custom Editors.
Here is a simple example which extends your editor script to display a message that indicates whether the target point is above or below the 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)"); } }}
This is how the Inspector for the LookAtPoint component looks with the message showing if the target point is above or below the GameObject.
Az IMGUI összes parancsához teljes hozzáférése van bármilyen típusú felület rajzolásához, beleértve a rendereléstA grafika képernyőre (vagy rendertextúrára) való rajzolásának folyamata. Alapértelmezés szerint a Unityben a fő kamera a képernyőre rendereli a nézetét. További információ
Lásd a Szószedetben Jelenetek kamera használatávalA komponens, amely a jelenet egy adott nézőpontjának képét hozza létre. A kimenet vagy a képernyőre rajzolódik, vagy textúraként rögzül. További információ
Lásd a Fogalomtárban a szerkesztőablakokon belül.
Scene View Additions
Extrakódot adhat hozzá a Scene View-hozEgy interaktív nézet a létrehozott világba. A Scene View-t a díszletek, karakterek, kamerák, fények és minden más típusú játékobjektum kiválasztására és pozicionálására használhatod. További információ
Lásd a Szójegyzékben. Ehhez implementálja az OnSceneGUI-t az egyéni szerkesztőjében.
Az OnSceneGUI ugyanúgy működik, mint az OnInspectorGUI, kivéve, hogy a Scene nézetben fut. A saját szerkesztővezérlők elkészítéséhez segítségül hívhatja a Handles osztályban definiált függvényeket. Az ott található összes függvény 3D Scene nézetekben való munkavégzésre készült.
//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(); } }}
Ha 2D GUI objektumokat (például: GUI vagy EditorGUI) szeretne hozzáadni, akkor azokat a Handles.BeginGUI() és Handles.EndGUI() hívásokba kell csomagolnia.