ScriptableObject as Enum

ScriptableObject 作為 Enum 可以有很多好處,像是可含有自己的屬性和方法等。另外還不具 Enum 的一些缺陷

Enum 的缺陷有

  1. 它會隱含(implicitly)的為所有元素賦予一個整數值,這造成刪改 Enum 中的值很不方便,若隨意刪除一個元素,那它之後元素的值都會變

    • 下面例子,沒有明確指定值,因此會自動從0開始為每個元素賦值
    1
    2
    3
    4
    5
    6
    enum Skill 
    {
    SpeedUp,
    PowerUp,
    DefenseUp
    }

    預設會自動幫你的賦值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    enum Skill 
    {
    SpeedUp = 0,
    PowerUp = 1,
    DefenseUp = 2
    }

    // 假設之後要刪除 `PowerUp` ,那麼在它之後元素的值都會變
    enum Skill
    {
    SpeedUp,
    DefenseUp // DefenseUp 的值會變為 1
    }
  2. 除非使用 Nullable 否則它不可以為 NULL ,因此一般常會自訂一個元素來代表空值

    • 自訂一個元素來代表空值
      1
      2
      3
      4
      5
      6
      7
      enum Skill 
      {
      NONE = 0,
      SpeedUp = 1,
      PowerUp = 2,
      DefenseUp = 3
      }
  3. C#enum 中不允許有方法或是屬性,需要使用擴展方法來完成

    • 不可以有方法或屬性
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      enum Skill 
      {
      NONE = 0,
      SpeedUp = 1,
      PowerUp = 2,
      DefenseUp = 3
      // 不可以
      // private float bonusRatio;
      // 不可以
      // public float GetBonusRatio(){ return bonusRatio; }
      }
      需要使用擴展方法來完成
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      public static class SkillExtensions
      {
      public static double GetBonusRatio(this Skill skill)
      {
      switch (skill)
      {
      case Skill.SpeedUp:
      return 1.2;
      case Skill.PowerUp:
      return 1.5;
      case Skill.DefenseUp:
      return 1.3;
      default:
      return 1.0;
      }
      }
      }

因此將 ScriptableObject 作為 Enum 來使用也是一種好選擇,使用的方式為

1
2
3
4
5
[CreateAssetMenu(menuName = "ScriptableObjects/SkillSO")]
public class SkillSO : ScriptableObject
{

}

然後在透過 Unity 編輯器建立需要的元素即可

使用上也和 Enum 類似

返回 ScriptableObject 系列

Reference:

評論