Unityの拡張機能『NaughtyAttributes』を紹介!
はじめに
Unityでのゲーム開発を行う上で、インスペクター内の表示をより見やすくしたいと思いませんか?そこで今回は、無料で使えるインスペクター拡張機能「NaughtyAttributes」をご紹介します。他にも有料のもの(Odin等)もありますが、今回は無料ということで「NaughtyAttributes」を使っていきます。
●NaughtyAttributesのGitHub
●NaughtyAttributesのUnityAssetStore
※UnityAssetStoreの方が不要なデータが少ないためおすすめです。●OdinのHP(Odinは有料ですが、その分機能も豊富で動作も安定しているらしい...知らんけど)
使い方
それではスクリプトを作成した際に下記のコードを記入します。
// エディタ上(インスペクター)での作業効率を向上します。
using NaughtyAttributes;
よく使うシリーズ(覚えていると役に立つ)
Label
インスペクターで表示される名前をわかりやすい名前に変更できる機能です。
エンジニア以外の方や英語が苦手な方でも、名前の意味を理解しやすくなります。
[Label("カスタムラベル")]
public string m_text = "";
★インスペクターでの表示
Button
実行できるボタンをインスペクターに表示してくれる。
// ボタンが表示されます。
[Button]
private void LaserAttack() { }
// ボタンの名前を設定可能
[Button("名前を設定")]
private void DownState() { }
★インスペクターでの表示
Foldout
複数の変数を折りたたみを行います。
// Aグループ
[Foldout("A")]
public int m_testA;
[Foldout("A")]
public int m_testB;
// Bグループ
[Foldout("B")]
public int m_testC;
★インスペクターでの表示(折り畳み中)
★インスペクターでの表示(展開時)
BoxGroup
変数のグループ化するものです。
[BoxGroup("チームA")] public int m_firstInt;
[BoxGroup("チームA")] public int m_secondInt;
[BoxGroup("チームB")] public float m_firstFloat;
[BoxGroup("チームB")] public float m_secondFloat;
★インスペクターでの表示
知っているとヒューマンエラーを防げるかも
Layer
プロジェクトに登録されているレイヤーをプルダウンで指定できるようになる。
※Layerの位置はインスペクター内の上部にあります。
[Layer]
public string m_layerName;
[Layer]
public int m_layerIndex;
★インスペクターでの表示
Tag
レイヤーと同様にタグに使用することもできます。
※Tagの位置はインスペクター内の上部にあります。
[Tag]
public string m_tagName;
[Tag]
public int m_tagIndex;
★インスペクターでの表示
ShowIf / HideIf
条件によってフィールドの表示/非表示を行います
[Header("ShowIfの場合")] // 指定した変数の上に文字を表示
public bool m_isOnA;
[ShowIf(nameof(m_isOnA))]
public int m_foo;
[Header("HideIfの場合")]
public bool m_isOnB;
[HideIf(nameof(m_isOnB))]
public int m_hoge;
※インスペクターでの表示(OFFの時)
※インスペクターでの表示(ONの時)
EnableIf / DisableIf
[ShowIf / HideIf]とほぼ同じ機能ですが一つ違うものとして非表示を行うものを完全に見えないようにしないことです。
[Header("EnableIfの場合")]
public bool m_isOnA;
[EnableIf(nameof(m_isOnA))]
public int m_foo;
[Header("DisableIfの場合")]
public bool m_isOnB;
[DisableIf(nameof(m_isOnB))]
public int m_hoge;
※インスペクターでの表示(OFFの時)
※インスペクターでの表示(ONの時)
※複数の条件を指定できます。
下記のコードのように設定することもできます!
public bool m_flgA;
public bool m_flgB;
// 両方がtrueだと表示する。
[EnableIf(EConditionOperator.And, "m_flgA", "m_flgB")]
public int m_enableIfAll;
// どちらか片方がtrueだと表示する
[EnableIf(EConditionOperator.Or, "m_flgA", "m_flgB")]
public int m_enableIfAny;
★両方がtrueだと表示する。
★どちらか片方がtrueだと表示する
★Enumを用いて行うことも可能となっています。
public enum EnumTest
{
Case0,
Case1,
Case2
}
public EnumTest m_testEnum;
// m_testEnumがCase0を選択している際のみ表示
[EnableIf("m_testEnum",EnumTest.Case0)]
public int m_enableIfAll;
知っていると使えるかも?
ReadOnly
読み取り専用
[ReadOnly]
public Vector3 m_pos;
// 他の型名でも使用できます。
[ReadOnly]
public bool m_isActive;
[ReadOnly]
public GameObject m_obj;
※インスペクターでの表示
OnValueChanged
インスペクターで値が変わったときにコールバックを受け取ることができます。
値が変わったときに何か処理するには[OnValidate]や[ExecuteAlways]を使用することが多いと思いますが、[OnValueChanged]はフィールドごとにコールバックを受けられるのでより細かな制御ができます。
[OnValueChanged(nameof(OnValueChanged))]
public int m_foo;
private void OnValueChanged()
{
Debug.Log(m_foo);
}
※インスペクターでの表示
MinValue / MaxValue
変数の範囲を制限するために使用できます。
// 最大値が設定している値まで到達するとそれ以上は上がりません。
[MaxValue(10)] public int m_maxValue;
// 最低値と最大値の間のみ値を設定可能
[MinValue(0), MaxValue(10)] public int m_minMaxValue;
// 最低値が設定している値まで到達するとそれ以下は下がりません。
[MinValue(0.0f)] public float m_minValue;
※インスペクターでの表示
MinMaxSlider
ダブルスライダーです。最小値はプロパティに保存されx、最大値はまたはフィールドyのプロパティに保存されます。
[MinMaxSlider(0.0f, 100.0f)]
public Vector2 m_minMaxSlider;
※インスペクターでの表示
AnimatorParam
Animator のパラメータの変更をドロップダウンでできるようになっています。
public Animator m_someAnimator;
[AnimatorParam("someAnimator")]
public int m_paramHash;
[AnimatorParam("someAnimator")]
public int m_paramName;
※インスペクターでの表示
Dropdown
ドロップダウン値を選択するためのインターフェースを使用しています。ドロップダウンの値はID、プロパティ、関数を行うこともできます。
[Dropdown("intValues")]
public int intValue;
private int[] intValues = new int[] { 1, 2, 3, 4, 5 };
[Dropdown("StringValues")]
public string stringValue;
private List<string> StringValues { get { return new List<string>() { "A", "B", "C", "D", "E" }; } }
[Dropdown("GetVectorValues")]
public Vector3 vectorValue;
private DropdownList<Vector3> GetVectorValues()
{
return new DropdownList<Vector3>()
{
{ "Right", Vector3.right },
{ "Left", Vector3.left },
{ "Up", Vector3.up },
{ "Down", Vector3.down },
{ "Forward", Vector3.forward },
{ "Back", Vector3.back }
};
}
※インスペクターでの表示
EnumFlags
enum フラグを設定するためのドロップダウンインターフェースを提供します。
public enum Direction
{
Nune = 0,
Right = 1 << 0,
Left = 1 << 1,
Up = 1 << 2,
Down = 1 << 3
}
[EnumFlags]
public Direction m_flg;
※インスペクターでの表示
InputAxis
ドロップダウンから入力軸を選択できます!
[InputAxis]
public string m_inputAxis;
※インスペクターでの表示
その他
他にも、種類があるので一度公式ドキュメントを参照してみると
新たな発見ができると思います。
ProgressBar
ReorderableList(並べ替え可能なリスト)
※List等の配列の順番を変えたい際に使える機能
Required
特定の参照タイプのフィールドが必須であることをユーザーに通知するために使用されます。
HorizontalLine
Unity のSpace属性に似ていますが、空白の代わりに水平線を描画します。線の高さ (太さ) と色を制御できます。
Scene
※ドロップダウンからインスペクターを介してビルド設定からシーンを選択します。
ShowAssetPreview
特定のアセット (スプライト、プレハブなど) のテクスチャ プレビューを表示します。
ShowNativeProperty
ShowNonSerializedField(非シリアル化フィールドを表示)
※ReadOnlyに近い機能だと思ってていいと思います。
SortingLayer
ドロップダウンインターフェースから並べ替えレイヤーを選択します。
InfoBox
警告等を入れることで整数に文字列を入れるなどのヒューマンエラーを阻止するものだと思います。
ValidateInput(入力の検証)
[Required]より最も強力なバリデータ属性。
Expandable
ScriptableObjectにつける。ScriptableObjectの値をインスペクターに表示してくれ、その場で編集もできる。
CurveRange
アニメーション カーブのと の値を制限したりy、インスペクタでカーブの色を変更したりできます。
AllowNesting(特別な属性)
デフォルトでは、ドロワー属性は構造体とクラス内にネストできます。 ただし、メタ属性とバリデーター属性は 引き出しではないため、そのままではネストをサポートしません。たとえば、構造体内でEnableIf / DisableIf属性を使用したい場合は、AllowNesting次のように属性を使用する必要があります。
参考サイト
●公式ドキュメント
●【Unity】26個の PropertyAttribute が使用できる「NaughtyAttributes」紹介
●NaughtyAttributesの実装を読み解く
●Unityインスペクタ拡張ライブラリ「NaughtyAttributes」
今回紹介した『NaughtyAttributes』以外にもインスペクターをきれいにする方法
【Unity(C#)】Inspectorをきれいに
最後に
ご一読いただきありがとうございました。
今回紹介したものは、現在ゲーム公開をしている作品『Ruins of the Colossus-巨像の遺跡-』の開発で使用したものを中心に紹介しております。Unityでの開発はひよこ並みなので、奥深くまで知るほど「こっちの方がいいのかも」と思える機能がある際には新たに紹介していこうと考えています。
公開しているゲーム作品『Ruins of the Colossus-巨像の遺跡-』
Discussion