インスペクターで設定できる色々な値

2021年3月4日

Unityでは、ゲームオブジェクトを選択、自作のスクリプトをコンポーネントとしてアタッチすることができます。
自作の場合、初期値を設定・調整することでゲームバランスを考えたり、自作コンポーネントを再利用することができるようになります。

フィールド値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public int hp;
}

インスペクター

privateアクセス

スクリプト

プライベートアクセスでは、属性[SerializeField]をつけることでインスペクターに表示できます
また、これはC#の仕様ですがprivateアクセス修飾子は省略することもできます。(privateがある場合と同意)

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    [SerializeField]
    private int hp;
}

インスペクター

配列値

publicアクセス

スクリプト

using UnityEngine;

public class Inspector : MonoBehaviour
{
    public int[] scores = new int[5];
}

インスペクター

スクリプト(要素数をインスペクターで設定する場合)

using UnityEngine;

public class Inspector : MonoBehaviour
{
    public int[] scores;
}

インスペクター(要素数は、Scoresの数値設定で決めます)

List<>値

publicアクセス

スクリプト

using System.Collections.Generic;
using UnityEngine;

public class Inspector : MonoBehaviour
{
    public List<int> scores;
}

インスペクター(配列の場合と同じく要素数は、Scoresの値で設定します)

プロパティ値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    [field: SerializeField]
    public int Hp { get; set; }
}

インスペクター

列挙値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public enum Job
    {
        Warrior,
        Wizard,
        Hero,
    }

    // インスペクターではプルダウンメニューで選択でき量になります
    public Job job;
}

インスペクター

Vector3値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public Vector3 vector3;
}

インスペクター

LayerMask値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public LayerMask layerMask;
}

インスペクター(プルダウンメニューからマスクを1つ以上選択することができます)

Color値

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public Color color;
}

インスペクター(カラーバーをクリックすると、ピッカーが表示されてビジュアルでの設定も可能になります)

コンポーネント

publicアクセス

スクリプト

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    public Transform tran;
}

インスペクター

自作クラスのインスタンス

publicアクセス

スクリプト

System.Serializable属性により、シリアル化します。インスタンスはメモリ上に作成されているため、Inspectorで固定情報を表示するためにシリアル化が必要になります。

using UnityEngine;

[System.Serializable]
public class Player
{
    public string name;
    public int hp;
}

public class InspectorSet : MonoBehaviour
{
    public Player player;
}

スクリプト(インナークラス)

using UnityEngine;

public class InspectorSet : MonoBehaviour
{
    [System.Serializable]
    public class Player
    {
        public string name;
        public int hp;
    }

    public Player player;
}

インスペクター

自作クラス(ジェネリッククラス)のインスタンス

unity 2020.1以降

publicアクセス

スクリプト

Playerクラスのhpの型をインスタンス作成時に決定することができます。

using UnityEngine;

[System.Serializable]
public class Player<T>
{
    public string name;
    public T hp;
}

public class InspectorSet : MonoBehaviour
{
    public Player<int> player1;
    public Player<float> player2;

    private void Start()
    {
        // コードの中で代入した場合、インスペクターの設定値よりこちらが適用されます
        // ジェネリッククラスを使うことで、player1のhpはint型、player2のhpはfloat型にすることができます
        player1.hp = 10;
        player2.hp = 10.3f;
    }
}

自作クラスのList<>

publicアクセス

スクリプト

PlayerクラスとList<>の組み合わせも可能です。

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Player
{
    public string name;
    public int hp;
}

public class InspectorSet : MonoBehaviour
{
    public List<Player> players;
}

UnityEvent

publicアクセス

スクリプト

インスペクターにビジュアルで実行されるスクリプトをセットすることができるようになります。

using UnityEngine;
using UnityEngine.Events;

public class InspectorSet : MonoBehaviour
{
    public UnityEvent sampleEvent;
}

UnityEvent(ビジュアルで設定してみる)

publicアクセス

スクリプト

インスペクターにビジュアルで実行されるスクリプトをセットすることができるようになります。

using UnityEngine;
using UnityEngine.Events;

public class InspectorSet : MonoBehaviour
{
    public UnityEvent sampleEvent;

    public void ShowHello()
    {
        Debug.Log("Hello");
    }
}

+をクリックして、設定を追加する

実行したいスクリプトがアタッチされているゲームオブジェクトをNone(Object)にD&D

No Functionにプルダウンメニューから[InspectorSet(コンポーネント)] -> [ShowHello(publicメソッド名)]を選択

イベントの呼び出しコードを追加。実行してみる

using UnityEngine;
using UnityEngine.Events;

public class InspectorSet : MonoBehaviour
{
    public UnityEvent sampleEvent;

    public void ShowHello()
    {
        Debug.Log("Hello");
    }

    void Start()
    {
        sampleEvent.Invoke();
    }
}

結果

UnityEvent(引数あり。ビジュアルで設定してみる)

publicアクセス

スクリプト

引数を渡す場合、UnityEvnetのジェネリックを使う必要があります。

デフォルトで MonoBehaviour の UnityEvent は動的に void 関数をバインドします。UnityEvent は 4 つまで引数を伴う関数バインドをサポートしていますので、これは動的実行のケースである必要はありません。これを実行するために、複数の引数をサポートするカスタム UnityEvent クラスを定義する必要があります。これは以下のように、本当に簡単にできます。

ここで、わざわざUnityEvent<>を継承し、派生クラスから宣言する必要があるのは、UnityEvent<>が抽象クラス(abstract クラス)のためです(Unity 2019.4で確認)

抽象クラスからは、直接インスタンスを作成できない仕様になっています

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class SampleEvent : UnityEvent<string>
{
}

public class InspectorSet : MonoBehaviour
{
    public SampleEvent sampleEvent;

    public void ShowHello(string msg)
    {
        Debug.Log("Hello " + msg);
    }
}

追加情報)Unity 2020.2で確認したところ、UnityEvent<>は、抽象クラスではなくなっているようです。
なので、次のように直接宣言することができます

using UnityEngine;
using UnityEngine.Events;

public class InspectorSet : MonoBehaviour
{
    public UnityEvent<string> sampleEvent;

    public void ShowHello(string msg)
    {
        Debug.Log("Hello " + msg);
    }
}

+をクリックして、設定を追加する

実行したいスクリプトがアタッチされているゲームオブジェクトをNone(Object)にD&D

No Functionにプルダウンメニューから[InspectorSet(コンポーネント)] ->Dynamic stringの [ShowHello(publicメソッド名)]を選択
Dynamic stringは、実行時に引数の値を受け渡すとき(今回)に選択します。

イベントの呼び出しコードを追加。実行してみる

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class SampleEvent : UnityEvent<string>
{
}

public class InspectorSet : MonoBehaviour
{
    public SampleEvent sampleEvent;

    public void ShowHello(string msg)
    {
        Debug.Log("Hello " + msg);
    }

    void Start()
    {
        sampleEvent.Invoke("World");
    }
}

結果

設計時に値を固定にしたいときは、次のように設定します。

固定設定を空白に追加します

UnityEvent(引数に自作クラスを使う。ビジュアルで設定してみる)

publicアクセス

スクリプト

引数を自作クラスの型で渡す場合、UnityEvnetのジェネリックを使います。
継承するUnityEventの型パラメータをPlayerとします

using UnityEngine;
using UnityEngine.Events;

public class Player
{
    public int hp;
}

[System.Serializable]
public class SampleEvent : UnityEvent<Player>
{
}

public class InspectorSet : MonoBehaviour
{
    public SampleEvent sampleEvent;

    public void ShowHp(Player p)
    {
        Debug.Log("Player HP =  " + p.hp);
    }
}

+をクリックして、設定を追加する

実行したいスクリプトがアタッチされているゲームオブジェクトをNone(Object)にD&D

No Functionにプルダウンメニューから[InspectorSet(コンポーネント)] ->Dynamic stringの [ShowHello(publicメソッド名)]を選択
Dynamic stringは、実行時に引数の値を受け渡すとき(今回)に選択します。

イベントの呼び出しコードを追加。実行してみる

using UnityEngine;
using UnityEngine.Events;

public class Player
{
    public int hp;
}

[System.Serializable]
public class SampleEvent : UnityEvent<Player>
{
}

public class InspectorSet : MonoBehaviour
{
    public SampleEvent sampleEvent;

    Player player = new Player();

    private void Start()
    {
        player.hp = 10;

        sampleEvent.Invoke(player);
    }

    public void ShowHp(Player p)
    {
        Debug.Log("Player HP =  " + p.hp);
    }
}

結果

2021年3月4日C#,Unity

Posted by hidepon