ScriptableObject as shared variable

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 實體, HPMaxHP

然後建立繼承 MonoBehaviourPlayer

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);
}
}

// 暴露給外部,這邊會綁定按鈕的 On Click 事件
public void Hurt()
{
CurrentHP.ApplyChange(-10);
}
}

在 Unity 編輯器中,將剛剛建立的 HPMaxHP 設定到 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 編輯器中,將 HPMaxHP 設定到 HPView 上,

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

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

並且可以發現這兩個 MonoBehaviourPlayerHPView 互相不知道彼此的存在,實現了鬆耦合(loosely coupled)。

返回 ScriptableObject 系列

Reference:

評論