LoginSignup
1
0

More than 1 year has passed since last update.

ScriptableObjectの表示される変数を限定する&表示名を変える

Last updated at Posted at 2021-09-19

はじめに

武器データを管理したいとして、武器の種類と攻撃力と必殺率の3つのパラメータがあり、ScriptableObjectで下のコードのように定義されているとします。

/// <summary>
/// 武器の種類
/// </summary>
public enum WeaponType
{
    Sword,  // 剣
    Bow, // 弓
}

[CreateAssetMenu(fileName = "WeaponData", menuName = "ScriptableObjects/WeaponData")]
[System.Serializable]
public class WeaponData : ScriptableObject
{
    public WeaponType WeaponType;
    public int attackPower; // 攻撃力
    public int criticalProbability; // 必殺率(剣のみ適用)
}

インスペクター上では下の画像のように表示されるはずです。
EditorDemo - SampleScene - PC, Mac & Linux Standalone - Unity 2020.2.1f1 Personal _DX11_ 2021_09_20 2_40_57 (2).png
弓の場合は必殺率が適用されない仕様の場合、CriticalProbabilityは表示する必要がありません。

インスペクター拡張で表示させる

インスペクター拡張によって武器の種類によって表示させる変数を限定することができます。

[CustomEditor(typeof(WeaponData))]
public class DialogueEditor : Editor
{
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.PropertyField(serializedObject.FindProperty("WeaponType"));
        EditorGUILayout.PropertyField(serializedObject.FindProperty("attackPower"));

        var weaponType = (WeaponType)serializedObject.FindProperty("WeaponType").enumValueIndex;
        // 剣の時だけ必殺率を表示
        if (weaponType == WeaponType.Sword)
        {
            EditorGUILayout.PropertyField(serializedObject.FindProperty("criticalProbability"));
        }

        serializedObject.ApplyModifiedProperties();
    }
}

EditorDemo - SampleScene - PC, Mac & Linux Standalone - Unity 2020.2.1f1 Personal _DX11_ 2021_09_20 2_47_29 (2).png

表示名を変更する

このままではインスペクターの表示名がScriptableObjectの変数名と同じになっています。
コードの中身について知らない人でも何のパラメータなのかが分かりやすくなるようにインスペクターでの表示名を変えてみます。

[CustomEditor(typeof(WeaponData))]
public class DialogueEditor : Editor
{
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        serializedObject.FindProperty("WeaponType").enumValueIndex 
            = (int)(WeaponType)EditorGUILayout.EnumPopup("武器の種類", (WeaponType)serializedObject.FindProperty("WeaponType").intValue);

        serializedObject.FindProperty("attackPower").intValue = 
            EditorGUILayout.IntField("攻撃力", serializedObject.FindProperty("attackPower").intValue);

        var weaponType = (WeaponType)serializedObject.FindProperty("WeaponType").enumValueIndex;

        if (weaponType == WeaponType.Sword)
        {
            serializedObject.FindProperty("criticalProbability").intValue = 
                EditorGUILayout.IntField("必殺率", serializedObject.FindProperty("criticalProbability").intValue);
        }

        serializedObject.ApplyModifiedProperties();
    }
}

EditorGUILayout.PropertyField()の代わりにEditorGUILayout.IntField()などを使って入力欄を表示して結果を代入するようにすることで表示名を変えることができます。
EditorDemo - SampleScene - PC, Mac & Linux Standalone - Unity 2020.2.1f1 Personal _DX11_ 2021_09_20 2_53_48 (2).png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0