Unityにおいて、あるGameObjectが更新された時だけUIの描画変更メソッドを呼び出すといった、同じシーンにあるGameObjectが持つコンポーネントの変数の変更を検知する、スマートな方法が知りたいです。
私はこういった時にはUpdate()
を使って、以下のような形で実装することが多いです。
c#
1public class Player : MonoBehaviour 2{ 3 public int HP { get; private set; } = 100; 4 5 private void Update() 6 { 7 // なにかしらの処理 8 9 // HPの書き換え 10 HP -= 10; 11 } 12} 13 14public class PlayerHPWidget : MonoBehaviour 15{ 16 // インスペクタで設定 17 public Player player = null; 18 private void Update() 19 { 20 UpdateWidget(); 21 } 22 private void UpdateWidget() 23 { 24 // player.HPの値に応じて処理を変える 25 if (player.HP == 100) { Debug.Log("満タン"); } 26 else if (player.HP >= 50) { Debug.Log("まだまだ"); } 27 else if (player.HP >= 20) { Debug.Log("そろそろ回復"); } 28 else if (player.HP > 0) { Debug.Log("危険!"); } 29 else { Debug.Log("死亡"); } 30 } 31} 32
この実装では UpdateWidget()
がさほど大きなコストがかからないため、問題とならないと思われます。しかし将来的に UpdateWidget()
が肥大化した時、 MonoBehaviorの Update()
の中で毎回呼び出すのは、明らかに負荷となると考えています。
この問題の解決策として、Player側に PlayerHPWidget
の参照をもたせておき、HPを書き換える度にそこから UpdateWidget()
を呼び出すというのを考えました。
C#
1public class Player : MonoBehaviour 2{ 3 public int HP { get; private set; } = 100; 4 public PlayerHPWidget widget = null; 5 private void Update() 6 { 7 // なにかしらの処理 8 9 // HPの書き換え 10 HP -= 10; 11 widget.UpdateWidget(); 12 } 13}
しかしこれでは、PlayerとPlayerHPWidgetが相互に依存しており良い実装とは言えないと思います。
なにか良い実装はあるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。