🔰

【Unity初心者向け】はじめてのエディタ拡張

2024/01/07に公開

はじめに

こんにちは。
本記事では、UnityのEditor拡張の中でもかなり基礎的な部分を紹介します。
Unityを触り始めた方が、開発への手札を増やす目的で読んでいただければ幸いです。
自分自身が学生の頃に欲しかった情報をまとめたものとなりますので、これをヒントにエディタ拡張への第一歩を踏み出していただけるとありがたいです。

本記事で紹介する機能を以下に列挙します。

  • MenuItem
  • ContextMenu
  • SettingsProvider

MenuItem

Unityのタブ部分に機能を追加することが出来ます。
Unity公式リファレンス - MenuItem

コードはこんな感じ

using UnityEngine;
using UnityEditor;

public class MenuItemExtension
{
	[MenuItem("MyMenuItem/Function01")]
	private static void Function()
	{
		Debug.Log("![](https://storage.googleapis.com/zenn-user-upload/b5c2c6974f41-20240107.png)
");
	}
}

ポイントは、以下の三点です。

  • staticメソッド
    • インスタンスに紐付かない関数にします。
  • MenuItemの引数に作成するメニューの名前を指定できる
    • ここではFunction01がメニューの名前になります。
  • メニュー名の指定には一つ以上の階層を掘る
    • MenuItemというタブの中に作成します。
    • 階層を作成しない場合はUnity側からエラーが出ます。

他にも、以下のような使い方もできます。

既存のタブに追加

先ほどのコードではMyMenuItemというタブの中に機能を作成しましたが、既存のWindowAssetsの中にも自作の機能を作成することが出来ます。

Priorityの設定

機能の順番を指定することが出来ます。
MenuItemの引数にPriorityを渡します。

[MenuItem("MyMenuItem/Function01", priority = 11)]

0 ~ 10 / 11 ~ 20 / 21 ~ 30 ... のように10区切りで仕切り線が引かれるので整理整頓にも使えます。

その他の機能
  • ショートカットキーの設定
  • Unityの各所にタブ、機能を追加
    • ProjectビューのCreateのメニュー
    • Projectビューの右クリックメニュー
    • コンポーネントのメニュー
      • この機能は次の項目のContextMenuでも似たようなことが出来ます。
      • こちらは、Unityの基礎クラスである、RigidBodyやBoxColliderにもメニュー追加することができます。

ContextMenu

コンポーネントの三点メニューに自作機能を追加することが出来ます。
[Unity公式リファレンス - ContextMenu]

コードはこんな感じ

using UnityEngine;

public class ContextMenuExtension : MonoBehaviour
{
    [ContextMenu("MyContextMenu")]
    private void Function()
    {
        Debug.Log("hello world...");
    }
}

ポイントは、以下の三点です。

  • コンポーネントに紐づいているのでMonoBehaviorを継承している必要がある
  • staticメソッドである必要はない
  • MenuItemと同様で階層を作成することもできる

基本的な使い方はMenuItemと同様です。
しかし、こちらはインスタンスに紐づいたメソッドを呼び出すことが出来るので、TransformからPositionへアクセスしたり、RigidBodyvelocityにアクセスすることが出来ます。

SettingsProvider

Editor > ProjectSettings... や、 Editor > Preference... に自作のメニューを追加することが出来ます。

コードはこんな感じ

using UnityEditor;

public class SettingsProviderExtension
{
	[SettingsProvider]
	private static SettingsProvider Create()
	{
		return new SettingsProvider("MySetting/", SettingsScope.Project)
		{
			label = "MySettingFunction",
			guiHandler = searchtext => EditorGUILayout.LabelField("TestMessage")
		};
	}
}

ポイントは、以下の三点です。

  • [SettingsProvider]を指定
  • SettingsProviderのコンストラクタに、タブ名ProjectかUserを指定
    • Projectを指定するとProjectSettings = プロジェクトに紐づいた設定
    • Userを指定するとPreference = ユーザーに紐づいた設定
  • guiHandlerに描画したい設定項目を入れる

こちらは、先の2点よりも少し難しい内容になりますが、Unityの設定画面の部分に追加することが出来るので使用用途は多岐にわたります。

最初は、こんなものあるんだ程度で覚えておくと後々役立つと思います。

おわりに

自分が学生の頃に知りたかった内容をテーマにまとめてみました。
紹介した機能を深掘ることで「できること」が徐々に増えていくかと思います。
あくまでエディタ拡張ってこういうことができるんだ~、というゆる~い視点で捉えていただけるとありがたいです!

ではまた。

Discussion