【Unity】Unityで学ぶStrategyパターン!モンスターに色んな技を使わせよう!【C#】【プログラム設計】

 

こんにちは!河条です!
今回はC#でStrategyというプログラム設計について学びましょう!

今回はPHPじゃなくてC#だよ!こういう設計の知識はオブジェクト指向プログラムであれば他の言語でも使えるから知らない人はぜひ覚えてみてね🤗

※事前知識:C#の基本構文、オブジェクト指向の知識

今回やること

1、技をいくつか用意する
2、何体かのモンスターを生成する
3、モンスターは技を2つまで覚えられる
4、モンスターに1で作った技を使わせてみる

※ 今回はとりあえず機能の確認とStrategyがどんなものかを知るのが目的なので、モンスターの絵とかダメージ計算もなくDebug.Logに出力させるだけです

パッと思い浮かぶやり方

モンスターごとに技のメソッドを用意して、アルゴリズムをかく!となると思います!
ただしこのやり方は思いついただけでも2つ問題があります

1、異なるモンスターが同じ技を持っていても、それぞれモンスタークラスごとに同じ技のメソッドを書かなくてはいけない🤔

技の仕様変更あったらモンスターごとに書いていた同じ技のロジックを全部書き換えていくという作業が必要になり面倒ですね😇チーン

2、今覚えている2つの技をフラグか何かで管理する羽目になる🤔

技の数だけ条件分岐が必要という面倒くささになります。まあList使えば何とかできそうな気もするけど😇チンチーン

Strategyパターンとは

ではどうすれば良いか!ということでStrategyパターンです!
Strategyパターンはいろんな状況、仕様に応じてアルゴリズム(今回でいうモンスターの技)を簡単に変更することができます!
これを使って上記の2点の問題を解決しましょう!

ザックリとした考え方

実装方法としては、技クラスという抽象クラスを継承させた技固有のクラスを何個も作り、インスタンス化させたモンスターに2つ技を持たせるイメージです!

これでモンスターごとに同じ技を記述する必要は無くなりますし、技の仕様が変更になってもそれ1つだけ直せば大丈夫です!
また、モンスターには1番目 or 2番目の技を使え!という命令だけで条件分岐もなく持たせている技を使わせることができます!

実際のコード

まずはいきなりメイン処理を!割とスッキリしていると思います!
条件分岐も一切使わずに、また技の切り替えも簡単にできますね!
また新しい技が増えたとしてもモンスタークラスは触る必要なく、技クラスを増やしてインスタンス化するだけで対応できます!(依存関係のないプラグラムってやつですね!)

上のコードの実行結果(技効果も載せてます)

ではメイン処理のようなプログラム組むための準備となる技クラスとモンスタークラスを作っていきましょう!

まずは冒頭でも書いた技の抽象クラスからです!

次に技クラスを継承させて実際の技のクラスを書きましょう!

最後にモンスタークラスです!

ざっくりまとめ


モンスタークラスにprivateな技の変数を2つ用意し、メイン処理で代入しています!
攻撃時は代入した技に応じてAttack関数とSkilleffect関数が動いてくれます!

今回はカワノバナとカワノカゲのモンスター二匹だけだけど、三匹になっても四匹になっても同じようにモンスタークラスを生成して、技を代入すればいいです!
新しく技を増やしたかったら(水鉄砲とか)その都度、技クラスを作ればモンスタークラスはそのままで拡張できます!
依存関係のないプログラムの意味はこれで何となくわかると思います!

ただあくまでもStrategyの一番の特徴は簡単にアルゴリズムの切り替えができることです!
結構汎用性高いと思うのでぜひ使ってみてください!!!!(^o^)人(^o^)