ScriptableObject
可以作為遊戲變數在各個 MonoBehaviour
之間分享資料,此外,透過這種方式還可以減少 MonoBehaviour
物件之間互相參考的耦合度。
下面將使用 ScriptableObject
建立玩家生命數值,並在不同的 MonoBehaviour
之間使用
首先建立一個繼承 ScriptableObject
的類 FloatVariable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| [CreateAssetMenu(menuName = "ScriptableObjects/FloatVariable", order = 1)] public class FloatVariable : ScriptableObject { #if UNITY_EDITOR [Multiline] public string DeveloperDescription = ""; #endif public float Value;
public void SetValue(float value) { Value = value; }
public void SetValue(FloatVariable value) { Value = value.Value; }
public void ApplyChange(float amount) { Value += amount; }
public void ApplyChange(FloatVariable amount) { Value += amount.Value; } }
|
接下來建立兩個 FloatVariable
實體, HP
與 MaxHP


然後建立繼承 MonoBehaviour
的 Player
類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Player : MonoBehaviour { public FloatVariable CurrentHP; public FloatVariable MaxHP; public float StartingHP; public bool ResetHP;
private void Start() { if (ResetHP) { CurrentHP.SetValue(StartingHP); } }
public void Hurt() { CurrentHP.ApplyChange(-10); } }
|
在 Unity 編輯器中,將剛剛建立的 HP
與 MaxHP
設定到 Player
上

接著建立一個 HPView
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class HPView : MonoBehaviour { public TextMeshProUGUI CurrentHPText; public TextMeshProUGUI MaxHPText;
public FloatVariable CurrentHP; public FloatVariable MaxHP;
private void Update() { CurrentHPText.text = CurrentHP.Value.ToString(); MaxHPText.text = MaxHP.Value.ToString(); } }
|
在 Unity 編輯器中,將 HP
與 MaxHP
設定到 HPView
上,

將 Player.Hurt()
設定給按鈕的 On Click 。

最後執行,在畫面上可以按下按鈕,觸發 Player.Hurt()
,可以觀察到 CurrentHPText
的變化

並且可以發現這兩個 MonoBehaviour
: Player
和 HPView
互相不知道彼此的存在,實現了鬆耦合(loosely coupled
)。
返回 ScriptableObject 系列
Reference: