カスタムエディタ

アプリケーションの開発を高速化するために、よく使うコンポーネントのカスタムエディタを作成します。 このページでは、GameObjectを作成する簡単なスクリプトの作成方法を紹介します。Unityのシーンの基本となるオブジェクトで、キャラクター、小道具、風景、カメラ、ウェイポイントなどを表現することができます。 GameObjectの機能は、それに付随するComponentによって定義されます。 詳細
用語集を参照常に点を見る

  1. C#スクリプトを作成し、それを「”LookAtPoint”」と名付ける。
  2. スクリプトを開き、その内容を以下のコードに置き換える
  3. シーン内の GameObject にスクリプトをアタッチするシーンにはゲームの環境とメニューがあります。 各シーンファイルは、それぞれ固有のレベルだと考えてください。 各シーンに、環境、障害物、装飾を配置し、ゲームを設計し、構築していきます。
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

プレイモードに入ると、スクリプトを取り付けた GameObject は、”Look At Point” プロパティに設定した座標の方向に向きを変えます。 エディタースクリプトを書くとき独自のコンポーネントを作成し、ゲームイベントをトリガーし、時間の経過とともにコンポーネントのプロパティを変更し、ユーザー入力に自由に反応できるコードの断片です。 詳細
用語集を参照してください。アプリケーションの実行中ではなく、Editモード中に特定のスクリプトを実行させることは、しばしば有用です。 これを行うには、次のようにクラスに ExecuteInEditMode 属性を追加します:

//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

さて、Editor で GameObject を移動したり、Inspector で “Look At Point” の値を変更すると、現在選択している GameObject、アセット、プロジェクト設定に関する情報を表示してその値を検査・編集できる Unity ウィンドウが表示されます。 詳細
用語集を参照、GameObject はワールド空間のターゲットポイントを見るように回転を更新する。

Making a Custom Editor

上記は、編集時に簡単なスクリプトを実行する方法を示していますが、これだけでは独自のエディタツールを作成することはできません。

Unityでスクリプトを作成すると、デフォルトではMonoBehaviourを継承しているため、GameObjectにアタッチできるコンポーネントになっています。 GameObjectにコンポーネントを配置すると、Inspectorにデフォルトのインターフェースが表示され、それを使ってすべてのパブリック変数、たとえば整数、フロート、文字列を表示したり編集したりすることができます。

LookAtPoint コンポーネントの Inspector は、デフォルトではこのように表示されます。

Vector3 フィールドのあるデフォルトの Inspector

カスタム エディターは、このデフォルトのレイアウトを、選択したエディター コントロールに置き換える、別のスクリプトとなります。

LookAtPoint スクリプトのカスタム エディターを作成するには:

  1. 新しい C# スクリプトを作成し、それを “LookAtPointEditor” と名付ける。
  2. スクリプトを開き、その内容を以下のコードに置き換える。 CustomEditor属性は、どのコンポーネントのエディタとして動作させるかをUnityに通知します。 CanEditMultipleObjects属性は、このエディタで複数のオブジェクトを選択し、同時に変更することができることを伝えます。 ここにどんなGUIコードを入れてもOnGUIと同じように動作しますが、Inspectorの中で実行されます。 エディターは、インスペクションしているGameObjectにアクセスするために使うターゲットプロパティを定義しています。

    LookAtPoint コンポーネントの Inspector が新しい Editor でどのように見えるかを示します:

    これは非常に似ています (「Script」フィールドは現在存在していませんが、これはエディター スクリプトがそれを表示する Inspector コードを追加しないためです)。

    Editor スクリプトで Inspector の表示方法を制御できるようになったので、任意のコードを使用して Inspector フィールドをレイアウトし、ユーザーが値を調整できるようにし、さらにグラフィックやその他の視覚的要素を表示することも可能になりました。 実際、Unity Editorで表示されるInspectorは、地形のような複雑なInspectorも含め、すべてシーン内の風景を表示します。 地形GameObjectは、シーンに大きな平面を追加し、地形のインスペクタウィンドウを使用して、詳細な風景を作成することができます。

    ここでは、ターゲット ポイントが GameObject の上か下かを示すメッセージを表示するために、エディター スクリプトを拡張する簡単な例を紹介します。

    レンダリング画面 (またはレンダー テクスチャ) にグラフィックを描くプロセスなど、あらゆるタイプのインターフェイスを描くためのすべての IMGUI コマンドに完全にアクセスすることができます。 デフォルトでは、Unity のメインカメラはそのビューをスクリーンにレンダリングします。 詳細情報
    用語集を参照 カメラを使用したシーンシーン内の特定の視点の画像を作成するコンポーネントです。 出力は、画面に描画されるか、テクスチャとしてキャプチャされます。 詳細情報
    編集ウィンドウ内の用語集を参照してください。

    Scene View Additions

    シーン ビューに追加コードを追加できる作成中の世界に対する対話型のビューです。 シーン ビューを使用して、風景、キャラクタ、カメラ、ライト、および他のすべてのタイプのゲーム オブジェクトを選択および配置します。 詳細
    は 用語集 を参照してください。 これを行うには、カスタムエディターでOnSceneGUIを実装します。

    OnSceneGUI は、シーンビューで実行されることを除いて、OnInspectorGUI と同じように動作します。 独自の編集コントロールを作成するために、Handles クラスで定義された関数を使用することができます。

    //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(); } }}

    2D GUI オブジェクト (例: GUI または EditorGUI) を追加したい場合、それらを Handles.BeginGUI() および Handles.EndGUI() への呼び出しでラップする必要があります。

コメントを残す

メールアドレスが公開されることはありません。