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: