エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

Unityアクションゲーム制作記 その4 判定、入りました

 モーションのセットがあらかた終わったということで、今回は予定通りプレイヤーキャラに当たり判定をつけていきます。ちなみに差別化をするといっていたコンボですが、ノーマルコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:なし、攻撃4:仰け反り、として、走りコンボは、攻撃1:仰け反り、攻撃2:仰け反り、攻撃3:吹き飛ばし、にしました。うん、だいぶゲームっぽくなってきた。
youtu.be

 ということで、実際にどんな作業をしていったかというと……。
f:id:hamazakifactory:20160618200414p:plain
 キャラ本体のCapsule Collider(キャラ移動用)、敵からの攻撃判定用のBox Colliderと鎌の攻撃判定用のBox Colliderをそれぞれアタッチしてくだけです。攻撃判定用のコライダーは、攻撃した(された)時に敵を吹き飛ばさないよう、isTriggerのチェックを入れます。
f:id:hamazakifactory:20160618201126p:plain
f:id:hamazakifactory:20160618201129p:plain
f:id:hamazakifactory:20160618201132p:plain
 この辺はゲーム次第だと思いますが、キャラ本体に細かく判定をつけたい時は、それぞれの場所に判定用のColliderを別途追加するようです。今回はガチの格闘アクションゲームにすることもないので写真下のように本体にBox Collider1つ付けるだけで、十分な感じになっています。
f:id:hamazakifactory:20160618201547p:plain
 ちなみに敵キャラはこんな感じです。
f:id:hamazakifactory:20160618111147j:plain
f:id:hamazakifactory:20160618113428j:plain
 こちらは、キャラクターと同じように本体のCapsule Collider、攻撃判定用のBox Collider、剣のBox Colliderをアタッチしていきます。
 実際の当たり判定の流れはどうしようかと、いろいろググったりいつもの参考サイトを見るにつけ、レイヤーマトリクスの設定によってを行って当たり判定の効率化を少し行えそう。で、ゲーム中に必要な判定を考えてみると、
「プレイヤーの攻撃は、敵本体にしか当たらない」
「敵の攻撃は、敵本体に当たらない」
「プレイヤー&敵の本体は地形に当たる」
「プレイヤー&敵の攻撃は地形に当たらない」
こんなもんかな? ということで、これくらいなら明らかに不要な判定を省けるかなーとレイヤーマトリクスの設定を行ってみます。
f:id:hamazakifactory:20160618202939p:plain
 適当に不要そうなものを選んでチェックを外してますが……大丈夫でしょう、きっと。諸々の設定が終わったので、ようやくオブジェクトの接触が起きてからの処理を組み込んでいきます。まず、必要なのは、以下の2つ。
・プレイヤーの攻撃が敵に当たった
・敵の攻撃がプレイヤーに当たった
 それぞれ接触後に必要な処理は、
・ダメージを加える(いずれ実装)
・受けた攻撃の属性によって「のけぞり」「吹き飛ばし」などのアニメーションを発生させる
 この2つ。処理の流れを作る時に気をつけたのが、「なるべくキャラクター本体に役割を集約させること」でした。OnTriggerEnterで判定を取ったところで諸々の処理せずに、わざわざ処理を回すとオーバーヘッドの時間がもったいないのは確かです。しかし、自分がこれまで作ったアプリでは、とにかくやれるところでやれることを勝手にやってしまって最後に苦労していることが多かったもので……少しは、整理してみようかなと。あと、昔ながらの逐次処理でしか物事を考えられないジジイなもんで、各所でばらんばらんに処理を流してしまうと、全体を把握するのが辛いのです。ということで、まとめたのが下になります。……わかりにくい。でも、こんな程度でもまとめておかないと、後で必ず自分で何をやっていたか忘れて困るのでこれでヨシとしておきます。
f:id:hamazakifactory:20160618203906p:plain
 もう1つ判定系で面倒くさいというか忘れそうなのが、攻撃中にColliderのON・OFFをしなければならないところ。今回の敵の場合でいうと、攻撃のモーションは、下ろしていた剣をいったん振り上げてから振り下ろすというモーションになっています。
f:id:hamazakifactory:20160618173940p:plain
 振り上げ前と振り下ろし後の余韻まで結構な時間があり、全部に判定をつけてしまうとゲームとしてまずいことになります。いろいろ悩んだ末、アニメーションイベントで必要な場所のみにColliderコンポーネントをON/OFFするメソッドを呼び出すことで対応しました。Unityでは、これがベターな方法なのかなー。アニメーションイベントは便利な一方、外から見えにくいこともあって、仕込んだものを忘れたり、仕込み忘れたりすると大変なことになりそう…気をつけなきゃ。
 次は、操作・カメラ系の見直しをする予定。気持ちのいいアクションをするためには……どうしたらいいんだろう。しばし悩んでみます。

※画像は説明用に適当にトリミング・再配置しています。キャプチャー画面をそのまま掲載してありません。あしからず。