サイドビューアクションゲームで、攻撃判定を作ろうとして、はたと困った。
武器にColliderをつけて、敵にぶつけ、敵のダメージメソッドを呼ぶためには、敵のスクリプト名が必要になる。
ところが、敵が一種類ならともなく、何種類も敵がいれば、当然、敵のスクリプト名も変わってくる。
例として、SlimeにSlime Managerスクリプトがあり、ここにダメージ処理用メソッドOndamageがある。
BanditにはBandit Managerというスクリプトがあり、ここにもダメージ処理用のOndamageがある場合、
Colliderがぶつかった敵のスクリプトのOndamageメソッドを呼ぶためには、まず、ターゲットのスクリプト名を取得する必要があるわけで、このスクリプト名の取得方法が、色々なサイトや記事を読んでも、全く見当たらなかった。
どれもこれも、スクリプト名が判っている前提で、Getcomponent<スクリプト名>()で取得する方法ばかり。
何が当たるか判らない状態を想定した記事を見つけることができなかった。
ならば、Slime ManagerやBandit Manager側でCollider判定して、敵側からPlayerの攻撃力を参照させて、敵自身でOndamageを処理させれば良いんじゃないか?とも思ったけど、これも、Player側が複数いる場合などを想定すると、結局は、当たった相手のスクリプト名が必要になる問題からは逃れらなさそうだった。
色々と悩んで、しまづさんのオンラインサロンで相談してみると、ジョニさんが継承という物を教えてくれて、無事に解決することができました。
この継承ってのは、SlimeとBanditの例の場合、まず、元になるになるEnemy Baseスクリプトを作成し、そこにOndamageメソッドを作成しておく。
次に、Slime ManagerスクリプトとBandit Managerスクリプトを、それぞれ、Enemy Baseスクリプトを継承させる方法で作成する。
こうすると、Playerの武器のColliderが当たったEnemyのスクリプト名ではなく、Enemy Baseをスクリプト名として指定してOndamageを実行することができるという優れもの。
使い方は、こんな感じ。
まず、Enemy Baseスクリプト。
この上ないシンプルさ😆
これで、実際何にも省略していない。まんま、この通り。
次にBandit。
こちらは、関係ない部分、移動や接地判定部分などは省略。
重要なのは、class名の横が、MonoBehaviourではなく、EnemyBaseになっていること。
これで、BnaditManagerスクリプトはEnemyBaseを継承したスクリプトになる。
あとはいつも通り、他の部分を作成し、Ondamageだけ、EnemyBaseのOndamageではなく自前のOndamageを作りたい場合は、public override void Ondamage()として作成すれば、自前のOndamageを適用できる。
SlimeManagerは、とりあえず、EnemyBaseのOndamageのままにした。
この場合、SlimeManagerにはOndamageを全く記載する必要はなく、ただ、EnemyBaseを継承するだけで良い。
そして、武器側はcollision判定で、ぶつかったオブジェク(Banditもしくはslime)のmanagerではなく、その継承元のスクリプト名を指定して、Ondamageを実行してやれば良い。
実験結果はこんな感じ。
これも、色々と応用できそうだ。
それにしても、学べば学ぶほど、Unityって深いなぁ😁