未分類

Unityエディタをもっと便利に!カスタムアトリビュートの作り方と活用法

未分類

1. はじめに

Unityを使ってゲームを開発していると、「Inspectorでの設定が面倒」「特定のスクリプトの値をもっと見やすくしたい」と感じることはありませんか?
そんなときに役立つのが「カスタムアトリビュート」です。

カスタムアトリビュートを使うと、UnityエディタのInspectorをカスタマイズできるので、スクリプトの管理がぐっと楽になります。たとえば:

  • 特定の変数だけを強調表示して見やすくする
  • ボタンを追加してスクリプト内のメソッドを直接実行できるようにする
  • 入力できる値の範囲を制限してエラーを減らす

といったことが可能になります。

Unityには、デフォルトで便利なアトリビュート([SerializeField][Range][Tooltip] など)が用意されていますが、これだけではカバーしきれない場面も多いです。
そこで、自分でカスタムアトリビュートを作成し、作業の効率化を図るのが今回のテーマです。

この記事では、Unityのカスタムアトリビュートの基本的な仕組みから、実際の作成手順、便利な活用例までをわかりやすく解説していきます。
「エディタ作業をもっとスムーズにしたい!」と考えている方は、ぜひ参考にしてください!




2. カスタムアトリビュートとは?

Unityでスクリプトを書くときに、変数の上に [SerializeField][Range(0, 10)] のような特殊な記述を見たことはありませんか? これらは アトリビュート(属性) と呼ばれるもので、Unityの Inspector(インスペクター) に表示される項目の見た目や動作をカスタマイズするために使われます。

例えば、次のコードを見てみましょう。

using UnityEngine;

public class Example : MonoBehaviour
{
[SerializeField] private int hiddenValue;
[Range(0, 10)] public float sliderValue;
[Tooltip("ここに説明を表示できます")] public string description;
}

このスクリプトをInspectorで見ると、sliderValue の項目にはスライダーが追加され、description の上には説明が表示されます。これは、それぞれ [Range][Tooltip] というアトリビュートのおかげです。


カスタムアトリビュートとは?

カスタムアトリビュートとは、自分で作成できるオリジナルのアトリビュート のことです。Unityに標準で用意されている [SerializeField][Range] などのアトリビュートでは足りない場合、自分の開発環境に合わせた 独自のカスタムアトリビュート を作成し、Inspectorの表示や挙動をカスタマイズできます。

例えば、こんな便利なカスタムアトリビュートが作れます:

  • 特定の値しか入力できないフィールド
    • 例えば、[OnlyEven] のようなアトリビュートを作れば、Inspectorで 偶数しか入力できない ように制限できます。
  • ボタンをInspectorに追加
    • [Button] というアトリビュートを作れば、Inspectorから関数を実行できるボタンを追加できます。
  • 文字列の入力を特定の形式に制限
    • 例えば、メールアドレスしか入力できないようにしたり、指定のキーワードのみ入力可能にしたりできます。



カスタムアトリビュートを使うメリット

カスタムアトリビュートを作成すると、Unityのエディタがもっと使いやすくなります。特に次のようなメリットがあります:

  1. Inspectorの見た目を改善し、わかりやすくできる
    • [Tooltip] のように説明を加えたり、スライダーやカラーピッカーを追加したりできます。
  2. ミスを防ぎやすくなる
    • 例えば、負の数を入力できないように制限することで、意図しないバグを減らせます。
  3. 開発スピードが向上
    • よく使う機能をInspectorに追加することで、スクリプトを編集しなくても素早く設定変更が可能になります。

既存のアトリビュートの例

Unityにはすでに多くの便利なアトリビュートが用意されています。以下のようなものを使うだけでも、Inspectorの使い勝手がかなり向上します。

アトリビュート説明
[SerializeField]private変数をInspectorに表示
[Range(min, max)]指定範囲のスライダーを表示
[Tooltip("説明")]フィールドにツールチップを追加
[Header("セクション名")]Inspectorで見出しを追加
[Space(n)]指定したピクセル分スペースを追加
[TextArea]複数行のテキスト入力フィールドを作成

これらの標準アトリビュートは便利ですが、「こういうのがあればもっと便利なのに!」と思うこともあるでしょう。
そこで、次の章では 独自のカスタムアトリビュートを作る方法 を詳しく解説していきます!




3. カスタムアトリビュートの作成手順

UnityのInspectorをより便利にするために、自分だけのカスタムアトリビュートを作成する方法を解説していきます!
ここでは、数値の入力範囲を制限するカスタムアトリビュートを作りながら、基本的な手順を学んでいきましょう。


ステップ1:新しいC#スクリプトを作成

まず、カスタムアトリビュートを作るためのC#スクリプトを作成します。

  1. 「Project」ウィンドウを開く
  2. 「Assets」フォルダ内で右クリック
  3. 「Create」→「C# Script」を選択
  4. スクリプト名を「LimitRangeAttribute」に変更

作成した「LimitRangeAttribute」スクリプトを開き、次のコードを入力してください。

using UnityEngine;

public class LimitRangeAttribute : PropertyAttribute
{
public float min;
public float max;

public LimitRangeAttribute(float min, float max)
{
this.min = min;
this.max = max;
}
}

解説

  • LimitRangeAttribute クラスを作成し、PropertyAttribute を継承
  • 最小値 (min) と最大値 (max) を指定できるコンストラクタを定義

ステップ2:エディタ拡張(PropertyDrawer)を作成

次に、このカスタムアトリビュートをInspector上で視覚的に反映させるためのスクリプトを作成します。

  1. 同じように「Create」→「C# Script」で「LimitRangeDrawer」を作成
  2. スクリプトを開いて以下のコードを入力
using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(LimitRangeAttribute))]
public class LimitRangeDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
LimitRangeAttribute range = (LimitRangeAttribute)attribute;

if (property.propertyType == SerializedPropertyType.Float)
{
property.floatValue = EditorGUI.Slider(position, label, property.floatValue, range.min, range.max);
}
else if (property.propertyType == SerializedPropertyType.Integer)
{
property.intValue = EditorGUI.IntSlider(position, label, property.intValue, (int)range.min, (int)range.max);
}
else
{
EditorGUI.LabelField(position, label.text, "Use LimitRange with float or int.");
}
}
}

解説

  • [CustomPropertyDrawer(typeof(LimitRangeAttribute))] を付けて、対象のアトリビュートを設定
  • OnGUI メソッドで、スライダーをInspector上に表示
  • float または int のみ対応し、それ以外はエラー表示



ステップ3:カスタムアトリビュートをスクリプトに適用

最後に、作成した LimitRangeAttribute を実際に使ってみましょう!

  1. 新しいC#スクリプト「TestScript」を作成
  2. 以下のコードを入力
using UnityEngine;

public class TestScript : MonoBehaviour
{
[LimitRange(0, 100)]
public float speed;

[LimitRange(10, 50)]
public int power;
}

確認方法

  1. Unityエディタに戻る
  2. 適当なGameObjectを作成
  3. 「TestScript」をアタッチ
  4. Inspectorを開くと「speed」と「power」にスライダーが追加されているのを確認

これで、Inspector上で数値の範囲を制限しつつスライダーで直感的に値を調整できるようになりました!


まとめ

  • カスタムアトリビュートを作成することでInspectorをカスタマイズできる
  • PropertyDrawerを使えばInspectorのUIを自由に変更可能
  • 実際に使うことで、より効率的なスクリプト管理が可能

カスタムアトリビュートは自作できますが、**より手軽にカスタマイズしたい場合は、Odin Inspector のようなアセットを活用すると、コードを書かずに高度なInspectorカスタマイズが可能です!

カスタムアトリビュートを活用して、自分だけの便利なUnityエディタを作ってみましょう!




4. 実践!便利なカスタムアトリビュート例

ここからは、具体的なカスタムアトリビュートを3つ紹介します。
どれもUnityのエディタを便利にするものなので、自分のプロジェクトに取り入れてみてください!


例1:テキストフィールドを大きくするアトリビュート

Inspector上のテキスト入力フィールドが狭くて使いにくいと感じたことはありませんか?
Unity標準の[TextArea]を使うとテキストフィールドを広くできますが、カスタムアトリビュートを作れば、より自由にカスタマイズできます。

まず、新しいC#スクリプトを作成して、LargeTextFieldAttributeを定義します。

カスタムアトリビュートの定義

using UnityEngine;

public class LargeTextFieldAttribute : PropertyAttribute
{
public int height; // テキストフィールドの高さ

public LargeTextFieldAttribute(int height = 5)
{
this.height = height;
}
}

次に、このアトリビュートをInspectorに適用するためのPropertyDrawerを作成します。

エディタ拡張(PropertyDrawer)の定義

using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(LargeTextFieldAttribute))]
public class LargeTextFieldDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
LargeTextFieldAttribute textArea = (LargeTextFieldAttribute)attribute;
position.height = EditorGUIUtility.singleLineHeight * textArea.height;
property.stringValue = EditorGUI.TextArea(position, property.stringValue);
}
}

使い方

スクリプト内の変数に[LargeTextField]を付けると、Inspectorのテキストフィールドが大きくなります!

public class Example : MonoBehaviour
{
[LargeTextField(10)]
public string largeText;
}

これで、Inspectorのテキスト入力が広くなり、見やすくなりました! 🎉




例2:指定した範囲の値のみ入力できるアトリビュート

Unityには標準の[Range]アトリビュートがありますが、整数のみを入力できるカスタムアトリビュートを作成してみましょう。

カスタムアトリビュートの定義

using UnityEngine;

public class IntRangeAttribute : PropertyAttribute
{
public int min;
public int max;

public IntRangeAttribute(int min, int max)
{
this.min = min;
this.max = max;
}
}

エディタ拡張(PropertyDrawer)の定義

using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(IntRangeAttribute))]
public class IntRangeDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
IntRangeAttribute range = (IntRangeAttribute)attribute;
property.intValue = EditorGUI.IntSlider(position, label, property.intValue, range.min, range.max);
}
}

使い方

public class Example : MonoBehaviour
{
[IntRange(0, 100)]
public int limitedValue;
}

このカスタムアトリビュートを使えば、整数のみのスライダーをInspectorに表示できるようになります!✨


例3:ボタンをInspectorに追加するアトリビュート

スクリプトの特定のメソッドをInspectorから実行できると便利ですよね?
例えば、デバッグ用に「敵をスポーンする」ボタンを作成できます。

カスタムアトリビュートの定義

using UnityEngine;
using System;

[AttributeUsage(AttributeTargets.Method)]
public class ButtonAttribute : PropertyAttribute { }

エディタ拡張(PropertyDrawer)の定義

using UnityEngine;
using UnityEditor;
using System.Reflection;

[CustomEditor(typeof(MonoBehaviour), true)]
public class ButtonEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();

MonoBehaviour targetScript = (MonoBehaviour)target;
MethodInfo[] methods = targetScript.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

foreach (MethodInfo method in methods)
{
if (Attribute.IsDefined(method, typeof(ButtonAttribute)))
{
if (GUILayout.Button(method.Name))
{
method.Invoke(targetScript, null);
}
}
}
}
}

使い方

public class Example : MonoBehaviour
{
[Button]
private void PrintMessage()
{
Debug.Log("ボタンが押されました!");
}
}

Inspectorに「PrintMessage」というボタンが追加され、それを押すとログにメッセージが出力されます!📢


まとめ

  • [LargeTextField] → テキストフィールドを広くする
  • [IntRange] → 整数のみのスライダーを作成
  • [Button] → Inspectorにボタンを追加

これらのカスタムアトリビュートを活用すれば、Unityエディタをより便利にカスタマイズできます!
試しに自分のプロジェクトに組み込んで、開発をスムーズにしてみてくださいね! 🚀




5. 応用編:カスタムアトリビュートの活用シーン

カスタムアトリビュートを作成することで、Unityのエディタを自分好みにカスタマイズし、作業効率を向上させることができます。ここでは、実際のゲーム開発で役立つ活用例をいくつか紹介します。


5.1 ゲーム開発で役立つ活用例

① デザイナー向けの直感的な設定パネルの作成

Unityでは、デザイナーが直接Inspector上でパラメータを調整することがよくあります。しかし、デフォルトのInspectorでは設定できる範囲が限られており、数値の入力ミスや設定の統一が難しくなることがあります。

例えば、ゲームのUIボタンの色を指定する際に、デザイナーがColor型のパラメータを自由に変更できるようにする代わりに、特定のカラーパレットから選択できるようにしたいとします。この場合、カスタムアトリビュートを使って、指定したカラーパレットからのみ選択できるようにすることで、デザインの一貫性を保つことができます。

using UnityEngine;

public class ColorPaletteAttribute : PropertyAttribute
{
public ColorPaletteAttribute() { }
}
using UnityEditor;
using UnityEngine;

[CustomPropertyDrawer(typeof(ColorPaletteAttribute))]
public class ColorPaletteDrawer : PropertyDrawer
{
private Color[] palette = { Color.red, Color.green, Color.blue, Color.yellow };

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (property.propertyType == SerializedPropertyType.Color)
{
EditorGUI.BeginProperty(position, label, property);
int selected = Mathf.Max(0, System.Array.IndexOf(palette, property.colorValue));
selected = EditorGUI.Popup(position, label.text, selected, palette.Select(c => c.ToString()).ToArray());
property.colorValue = palette[selected];
EditorGUI.EndProperty();
}
else
{
EditorGUI.PropertyField(position, property, label);
}
}
}

このようにすれば、Inspector上でカラーパレットから色を選択できるようになり、デザイナーが誤った色を選択するのを防ぐことができます。


② デバッグ用の表示カスタマイズ

デバッグ時に特定の変数の値をInspectorで見やすくしたい場合にも、カスタムアトリビュートは役立ちます。

例えば、ゲームオブジェクトの移動速度やスコアなどのデバッグ時に特に重要な変数を強調表示したい場合、カスタムアトリビュートを作成してInspector上で目立たせることができます。

using UnityEngine;

public class HighlightAttribute : PropertyAttribute { }
using UnityEditor;
using UnityEngine;

[CustomPropertyDrawer(typeof(HighlightAttribute))]
public class HighlightDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUIStyle style = new GUIStyle(EditorStyles.boldLabel) { normal = { textColor = Color.red } };
EditorGUI.LabelField(position, label, style);
position.y += EditorGUIUtility.singleLineHeight;
EditorGUI.PropertyField(position, property);
}
}

このアトリビュートを使えば、特定の変数をInspector上で強調表示でき、重要な値をデバッグする際に見落としを防ぐことができます。

[Highlight]
public int playerHealth;

③ ツールスクリプトの利便性向上

ゲーム開発では、レベルデザインやオブジェクト配置を効率的に行うためにエディタツールを作成することがあります。このとき、カスタムアトリビュートを使うと、Inspector上でボタンを追加し、特定の処理を手軽に実行できるようになります。

例えば、特定のオブジェクトをランダムな位置に配置するボタンをInspectorに追加したい場合、以下のようなカスタムアトリビュートを作成できます。

using UnityEngine;

public class ButtonAttribute : PropertyAttribute { }
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Transform))]
public class ButtonEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
Transform t = (Transform)target;

if (GUILayout.Button("ランダム配置"))
{
t.position = new Vector3(Random.Range(-5f, 5f), 0, Random.Range(-5f, 5f));
}
}
}

このコードを適用すると、Inspectorに「ランダム配置」ボタンが追加され、ボタンをクリックするだけでオブジェクトの位置をランダムに変更できるようになります。




5.2 エディタ拡張と組み合わせる

カスタムアトリビュートは、エディタ拡張と組み合わせることでさらに強力なツールを作成できます。例えば、以下のような使い方が考えられます。

① ScriptableObjectと組み合わせたデータ管理

ScriptableObjectを使ってゲーム内のデータ(例えばアイテムやキャラクターのステータス)を管理する際、Inspectorの見た目をカスタマイズすることで、データの視認性を向上させることができます。

② EditorWindowと連携した専用ツール

カスタムアトリビュートをEditorWindowと連携させることで、より高度なツールを作成することも可能です。例えば、特定のアトリビュートが付与されたスクリプトを一括検索し、まとめて管理するようなツールを作ることもできます。


5.3 まとめ

カスタムアトリビュートを活用することで、Unityのエディタをより直感的で使いやすくカスタマイズできます。特に、以下のようなシーンで活用すると、作業効率を大幅に向上させることができます。

  1. デザイナー向けの直感的な設定パネルの作成(カラーパレットの選択など)
  2. デバッグ用の表示カスタマイズ(重要な変数を強調表示)
  3. ツールスクリプトの利便性向上(Inspector上のボタンで作業を自動化)
  4. エディタ拡張と組み合わせた高度なツールの開発

これらの技術を活用して、より快適なUnity開発環境を構築してみてください!




6. まとめ

Unityのカスタムアトリビュートを作成することで、Inspectorの使い勝手を大幅に向上させることができます。特に、デザイナーやプログラマーがスクリプトの値を視覚的に分かりやすく編集できるようになるため、開発の効率が格段にアップします。

本記事では、
カスタムアトリビュートの基本概念
実際の作成手順(属性クラスの定義とPropertyDrawerの実装)
便利なカスタムアトリビュートの例
実用的な活用シーン
について解説しました。

カスタムアトリビュートは、シンプルなものから高度なものまで幅広く応用できます。最初は簡単なものから試して、徐々にプロジェクトに合わせた便利なアトリビュートを作成してみましょう。

さらにエディタを便利にしたい場合は、Editor拡張(EditorWindowやScriptableObject) も活用してみると良いでしょう。カスタムインスペクターと組み合わせれば、Unityの開発環境を自分好みにカスタマイズすることができます。
ただし、ゼロから作るのが大変な場合は、Odin Inspector を使えば、コードを書かずにエディタのカスタマイズが可能です。開発の効率化にぜひ活用してみてください!

カスタムアトリビュートを活用して、より快適なUnity開発ライフを楽しみましょう! 🚀




よくある質問(FAQ)

Q
カスタムアトリビュートを作成すると、ゲームのパフォーマンスに影響がありますか?
A

いいえ、カスタムアトリビュートは主にエディタ上での表示や操作の改善を目的としているため、ランタイムのパフォーマンスには影響しません。

Q
カスタムアトリビュートを適用した変数は、エディタでしか影響しませんか?
A

はい。基本的にPropertyDrawerを使用するカスタムアトリビュートは、Inspector上の表示にのみ影響します。ゲーム内での動作には関係ありません。

Q
どんなときにカスタムアトリビュートを使うべきですか?
A

スクリプトの可読性や操作性を向上させる目的で使用すると効果的です。特に、頻繁に値を変更する設定項目などで役立ちます。

タイトルとURLをコピーしました