ScriptableObject as Enum
將 ScriptableObject 作為 Enum 可以有很多好處,像是可含有自己的屬性和方法等。另外還不具 Enum 的一些缺陷
Enum 的缺陷有
它會隱含(
implicitly)的為所有元素賦予一個整數值,這造成刪改Enum中的值很不方便,若隨意刪除一個元素,那它之後元素的值都會變- 下面例子,沒有明確指定值,因此會自動從0開始為每個元素賦值
1
2
3
4
5
6enum Skill
{
SpeedUp,
PowerUp,
DefenseUp
}預設會自動幫你的賦值
1
2
3
4
5
6
7
8
9
10
11
12
13enum Skill
{
SpeedUp = 0,
PowerUp = 1,
DefenseUp = 2
}
// 假設之後要刪除 `PowerUp` ,那麼在它之後元素的值都會變
enum Skill
{
SpeedUp,
DefenseUp // DefenseUp 的值會變為 1
}除非使用
Nullable否則它不可以為NULL,因此一般常會自訂一個元素來代表空值- 自訂一個元素來代表空值
1
2
3
4
5
6
7enum Skill
{
NONE = 0,
SpeedUp = 1,
PowerUp = 2,
DefenseUp = 3
}
- 自訂一個元素來代表空值
在
C#,enum中不允許有方法或是屬性,需要使用擴展方法來完成- 不可以有方法或屬性 需要使用擴展方法來完成
1
2
3
4
5
6
7
8
9
10
11enum 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
17public 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 | [] |
然後在透過 Unity 編輯器建立需要的元素即可
使用上也和 Enum 類似
Reference: