-- 回答者様から目的が不鮮明とのご指摘を受けましたので、下記により具体的な質問を付け加えました。--
殆どの処理は同じだが、一部だけ処理が違う場合どのような構成で書けばよいのでしょう?
下に良く使う方法を2つ挙げました。
2,3種類の場合は2を使い、それ以上になると1を使っています。
ですがどちらにしろ面倒な事には変わりなくもっと良い方法があれば御教授願いたいです。
あと余談ですが、プレビュー画面の文字が全て黒色になっているのですがこれは私だけですか?
1: 共通している処理を基底クラスにして違う部分を派生クラスに記載する
〇: それぞれの派生クラスの中に処理が書けるので見て分かりやすい
×: これらを管理する時に一つずつOverrideされた関数を呼ぶのが面倒。宣言も面倒。
C#
1public class Main : MonpBehaviour 2{ 3 private ClassA classA; 4 private ClassB classB; 5 private ClassC classC; 6 7 private void Start() { 8 classA = new ClassA(); 9 classB = new ClassB(); 10 classC = new ClassC(); 11 } 12 13 private void Update() { 14 classA.ManagedUpdate(); 15 classB.ManagedUpdate(); 16 classC.ManagedUpdate(); 17 } 18} 19 20public class BaseClass { 21 protected void Hoge() { 22 } 23 24 public virtual void ManagedUpdate() { 25 } 26} 27 28public class ClassA : BaseClass { 29 public override void ManagedUpdate() { 30 } 31} 32public class ClassB : BaseClass { 33 public override void ManagedUpdate() { 34 } 35} 36public class ClassC : BaseClass { 37 public override void ManagedUpdate() { 38 } 39}
2:すべて同じクラスを使用し、Enumの値によって処理を変える
〇: 呼び出しは簡単。
×: ManagedUpdateの中身がすごく長くなる
public class Main : MonpBehaviour { private BaseClass[] baseClasses = new BaseClass[3]; private void Start() { baseClass[0] = new BaseClass(TYPE.A); baseClass[1] = new BaseClass(TYPE.B); baseClass[2] = new BaseClass(TYPE.C); } private void Update() { foreach(BaseClass baseClass in baseClasses) { baseClass.ManagedUpdate(); } } } public class BaseClass { private TYPE type; public BaseClass(TYPE type) { this.type = type; } private void Hoge() { } public void ManagedUpdate() { switch(type) { // それぞれに異なる処理を書く case TYPE.A: break; case TYPE.B: break; case TYPE.C: break; } } } public enum TYPE { A, B, C }
-----------------------------追記-------------------------------
・条件
プレイヤーはDキーを押すとMoveUIが頭上に出現する
プレイヤーはAキーを押すとStopUIが頭上に出現する
一度に出せるUIは1種類/1つのみ
!___既に同じUIが出ている場合は何も起こらない
!___違うUIが出ている場合はそのUIを消してから新しいUIを出す
各UIは出現/消滅時に演出をする
UIを扱うPlayerがどうしても冗長になってしまっています。
また今後プレイヤーが扱うUIの種類が増えるとさらに長くなってしまいます。
どうにかここをシンプルに出来ないでしょうか?
public class UiManagement { private MoveUI[] moveUIs; private StopUI[] stopUIs; public MoveUI FindNotUseMoveUI() { foreach(MoveUI moveUI in moveUIs) { if (moveUI.IsEnable == false) return moveUI; } return null; } public StopUI FindNotUseStopUI() { foreach (StopUI stopUI in stopUIs) { if (stopUI.IsEnable == false) return stopUI; } return null; } } public class Player : MonoBehaviour { private UiManagement uiManagement; private MoveUI moveUI; private StopUI stopUI; private void Update() { if(Input.GetKeyDown(KeyCode.A)) { if (stopUI != null) return; if (moveUI != null) { moveUI.Disable(); moveUI = null; } stopUI = uiManagement.FindNotUseStopUI(); stopUI.Enable(); } if (Input.GetKeyDown(KeyCode.D)) { if (moveUI != null) return; if (stopUI != null) { stopUI.Disable(); stopUI = null; } moveUI = uiManagement.FindNotUseMoveUI(); moveUI.Enable(); } if (moveUI != null) moveUI.ManagedUpdate(); else if (stopUI != null) stopUI.ManagedUpdate(); } } public class MoveUI : BaseUI { public void ManagedUpdate() { Debug.Log("MoveUI出現中"); } } public class StopUI : BaseUI { public void ManagedUpdate() { Debug.Log("StopUI出現中"); } } public class BaseUI { public bool IsEnable { get; private set; } public void Enable() { IsEnable = true; } public void Disable() { IsEnable = false; } }
回答2件
あなたの回答
tips
プレビュー