ScriptableObject의 표시되는 변수를 제한하고 표시 이름 변경

9389 단어 ScriptableObjectUnity

소개



무기 데이터를 관리하고 싶다면 무기 유형과 공격력과 필살률의 세 가지 매개 변수가 있으며 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() 등을 사용하여 입력란을 표시하고 결과를 대입하도록 함으로써 표시명을 바꿀 수 있습니다.

좋은 웹페이지 즐겨찾기