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


はじめに

武器データを管理したいとして、武器の種類と攻撃力と必殺率の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; // 必殺率(剣のみ適用)
}

インスペクター上では下の画像のように表示されるはずです。

弓の場合は必殺率が適用されない仕様の場合、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();
    }
}

表示名を変更する

このままではインスペクターの表示名が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()などを使って入力欄を表示して結果を代入するようにすることで表示名を変えることができます。