🎮

Unityの拡張機能『NaughtyAttributes』を紹介!

2023/12/01に公開

はじめに

Unityでのゲーム開発を行う上で、インスペクター内の表示をより見やすくしたいと思いませんか?そこで今回は、無料で使えるインスペクター拡張機能「NaughtyAttributes」をご紹介します。他にも有料のもの(Odin等)もありますが、今回は無料ということで「NaughtyAttributes」を使っていきます。

●NaughtyAttributesのGitHub
https://github.com/dbrizov/NaughtyAttributes#installation

●NaughtyAttributesのUnityAssetStore
https://assetstore.unity.com/packages/tools/utilities/naughtyattributes-129996
※UnityAssetStoreの方が不要なデータが少ないためおすすめです。

●OdinのHP(Odinは有料ですが、その分機能も豊富で動作も安定しているらしい...知らんけど)
https://odininspector.com/

使い方

それではスクリプトを作成した際に下記のコードを記入します。

使用方法
// エディタ上(インスペクター)での作業効率を向上します。
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;

※インスペクターでの表示

ドロップダウン値を選択するためのインターフェースを使用しています。ドロップダウンの値は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次のように属性を使用する必要があります。

参考サイト

●公式ドキュメント
https://dbrizov.github.io/na-docs/index.html

●【Unity】26個の PropertyAttribute が使用できる「NaughtyAttributes」紹介
https://baba-s.hatenablog.com/entry/2017/12/27/154300#Slider

●NaughtyAttributesの実装を読み解く
https://qiita.com/Kosei-Yoshida/items/d7e3f3a7999ecacc5ba0

●Unityインスペクタ拡張ライブラリ「NaughtyAttributes」
https://qiita.com/ozaki_shinya/items/58a935407c8b020a7121

今回紹介した『NaughtyAttributes』以外にもインスペクターをきれいにする方法

【Unity(C#)】Inspectorをきれいに
https://qiita.com/OKsaiyowa/items/07e69f15e28387adbcf8

最後に

ご一読いただきありがとうございました。

今回紹介したものは、現在ゲーム公開をしている作品『Ruins of the Colossus-巨像の遺跡-』の開発で使用したものを中心に紹介しております。Unityでの開発はひよこ並みなので、奥深くまで知るほど「こっちの方がいいのかも」と思える機能がある際には新たに紹介していこうと考えています。

公開しているゲーム作品『Ruins of the Colossus-巨像の遺跡-』
https://kobedenshigame.itch.io/ruins-of-the-colossus

Discussion