Upgrade to Pro — share decks privately, control downloads, hide ads and more …

こわくないエディター拡張入門

 こわくないエディター拡張入門

unity1week online共有会 #13にて発表させていただいたスライドです。
動画等は配信をご確認ください。
https://youtu.be/COFWY3BrDEw?t=2786

ゲムシャリコ

October 14, 2023
Tweet

Other Decks in Technology

Transcript

  1. 実装 using UnityEditor; using UnityEngine; [CustomEditor(typeof(MoveBetween))] public class MoveBetweenEditor :

    Editor { private void OnSceneGUI() { MoveBetween moveBetween = (MoveBetween)target; EditorGUI.BeginChangeCheck(); Vector3 position = Handles.PositionHandle(moveBetween.destination, Quaternion.identity); if(EditorGUI.EndChangeCheck()) { Undo.RecordObject(moveBetween, "Change Destination"); moveBetween.destination = position; } } }
  2. using UnityEditor; エディター拡張に関するクラスは UnityEditor名前空間にある。 using UnityEditorを忘れない。 大体のIDEで補完してくれるので こんなのあったな、ぐらいでOK。 ビルドに含まれない コードでのみ利用できる

    using UnityEditor; using UnityEngine; クラス等をグループ化して まとめるもの。 各クラスはUnityEditor.Editor のような形で表現できるが、 using で省略できる。 名前空間 参考: https://docs.unity3d.com/ScriptReference/UnityEditor.html
  3. class XXX : Editor MonoBehaviourみたいなもの。 MonoBehaviour(スクリプト)用の エディター拡張のクラスは、 Editorクラスを継承 させる。 [CustomEditor(typeof(MoveBetween))]

    public class MoveBetweenEditor : Editor { …… } ScriptableObjectの エディターを拡張するときも Editorクラスを継承して使う。 ScriptableObject Editor MoveBetweenEditor 継承 親 子 参考: https://docs.unity3d.com/ScriptReference/Editor.html
  4. private void OnSceneGUI() { …… } OnSceneGUI() Unityから呼ばれるイベント関数。 Updateみたいなイメージ。 ヒエラルキー上で

    選択されているときに呼ばれる。 シーンビューの表示を拡張する。 インスペクターが表示されるときに呼ばれる インスペクターの機能を拡張できる。 UIToolkitではCreateInspectorGUIを使う。 OnInspectorGUI() 2 1 「2」を選択中 「2」のOnSceneGUIが呼ばれている 参考: https://docs.unity3d.com/ScriptReference/Editor.html
  5. EditorGUI.BeginChangeCheck() EditorGUI.EndChangeCheck() : bool これに囲まれたGUI要素(後述)が 変更されたかを検知する。 EditorGUI.BeginChangeCheck(); …… if(EditorGUI.EndChangeCheck()) {

    …… } BeginChangeCheck EndChangeCheck PositionHandle 変更されてる?👀👀 あったよ!(true) or なかったよ!(false) 変更見てるよ! 参考: https://docs.unity3d.com/ja/current/ScriptReference/EditorGUI.BeginChangeCheck.html
  6. Handles.PositionHandle (Vector3 position, Quaternion rotation) : Vector3 移動できるハンドルを制御するGUI要素。 EditorGUI.Begin/EndChangeCheck で囲み、変更を検知する。

    Vector3 position = Handles.PositionHandle( moveBetween.destination, Quaternion.identity ); 真ん中の半透明の面を ドラッグすると平面で移動 できるって知ってました? 私は知りませんでした。 参考: https://docs.unity3d.com/ja/current/ScriptReference/Editor-target.html
  7. Undo.RecordObject (Object objectToUndo, string name) アンドゥ(Ctrl+Z)に対応させる。 オブジェクトを変更する直前に呼び出す。 Undo.RecordObject( moveBetween, "Change

    Destination“ ); moveBetween.destination = position; Edit>Undo History で確認できる 参考: https://docs.unity3d.com/ja/current/ScriptReference/Undo.RecordObject.html
  8. ね?簡単でしょ? using UnityEditor; using UnityEngine; [CustomEditor(typeof(MoveBetween))] public class MoveBetweenEditor :

    Editor { private void OnSceneGUI() { MoveBetween moveBetween = (MoveBetween)target; EditorGUI.BeginChangeCheck(); Vector3 position = Handles.PositionHandle(moveBetween.destination, Quaternion.identity); if(EditorGUI.EndChangeCheck()) { Undo.RecordObject(moveBetween, "Change Destination"); moveBetween.destination = position; } } }