【プログラマー向け】クラス設計のリファクタリング#1
皆さんこんにちは!
ご閲覧いただきありがとうございます。
本日はタイトルにもある通り、趣向を変えて制作者様向けに
敵クラスの設計について失敗したな~と思うところがあったので
こちらをリファクタリングしつつ
微力ながら解説を行っていこうかと思います!
開発環境は以下の通りです。
・Unity
・VisualStudio 2022
・c#
現状の実装について
ということで、敵クラスが以下フォルダにまとまっています
・Bullet
・Generator
・ScriptableObject
こちらについては今回リファクタリングを行わないためノータッチで進めます
その他のクラスについて
・EnemyBase
・EnemyEliteBase
・EnemyBossBase
→敵のコアクラス、これがないと動きません
・EnemyManager
→敵本体に別クラスからアクセスを行うためのクラス
敵のプーリングもこちらで行っています
・EnemyDefine
→列挙型などの定義関連をまとめたクラス
なにがいけないのか
敵コアクラスの構造に改善の余地があり、とりあえず継承させとけばどうにかなるかと考えてた筆者の脳内では以下のようになっていました
・EnemyBase
└スライム
└スケルトン
・EnemyEliteBase (EnemyBaseを継承)
└スライムキング
└スケルトンキング
※いわゆる中ボスたち
・EnemyBassBase (EnemyBaseを継承)
└サキュバスちゃん
ただし、ヴァンサバライクなゲームなので、敵一体一体にそれほど特徴的な
差はなく、ステータスが多少変わる程度なので、ベースクラスという
骨組みだけが残された状態でそれを各Prefabにくっつけているだけなんですね。
さらに、EnemyBaseクラスで自滅の仕方だったり、行動制御まで行っているためEnemyEliteBaseクラスに関しては死亡処理の中で
宝箱をドロップするだけのスカスカな実装になっていました↓
これだとSOLID原則の単一責任の原則が守れていません
(そもそも場合によって中ボス以外からも宝箱を出したくなる時があるかもしれないのでこういった実装はよろしくない)
どうやって改修を行うか
当ゲームでは敵ごとに特殊な処理が入るわけではないのと、量産型の敵を
バリエーションがあるように見せたいので、機能の取り回しが
簡単に行えるようコンポーネント指向な設計に修正していこうと思います!
とりあえずの構想としてはこちら↓
(見やすいようにすべて外に出してますが、機能のまとまりはフォルダを切りましょう)
・EnemyCore
→EnemyBaseから機能分けして、残った共通部
→EliteとBossは中身の実装がなかったので機能分けした部分に統合
→各インターフェースの取り扱いのみを記述します
・IEnemyDrop (インターフェース)
└EnemyDropCoin
└EnemyDropExp
└EnemyDropTresureBox
→ドロップアイテムについてのクラス
→キャラにとって、ドロップアイテムをたくさん出したい場合があるかもしれないのでCore側ではリスト配列として保持
・IEnemySuicide (インターフェース)
└EnemySuicideTimer
└EnemySuicideEvent
→自滅のさせ方を決めるクラス
・IEnemyMovement (インターフェース)
└EnemyMovementBoss
└EnemyMovementStraight
└EnemyMovementTrace
→敵の行動制御クラス
→〇〇専用の処理を書きたい場合も使いやすい
といった具合でリファクタリングを行っていこうと思います!
本日はここまでにして次回、ソースレベルでの解説を行っていこうと思います。
閲覧いただきありがとうございました!