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: