ステージの生成が出来るようになったところで、敵をステージ上に配置しようと思います。
ユニティちゃんは、ステージの上を駆け抜けていくわけですが、このままでは行く手を拒む存在がいないので、ゲームとして成立しません。
精神と時の部屋のような真っ白いフィールドをひたすら走り続けるゲームから、ステージ上に出現する敵を避けてスコアを積み重ねていくゲームへグレードアップしていきます。
気絶状態を伴うダメージ処理について
敵オブジェクトのインポートと配置
まずは、ダメージ処理を発生させるために敵となるモデルをアセットストアからインポートしておきましょう。私は「Small Red Dragon」という3Dモデルを使います。
敵に1回当たってゲームオーバーだと流石に難易度が高いので、2回当たったらゲームオーバーとしておきます。上の画像のようにユニティちゃんの正面に敵モデルを配置してみます。
敵オブジェクトには「Enemy」など何かしらタグを設定しておいてください。
また、衝突判定を検知するために、コライダもアタッチしておきましょう。
アニメーション作りとダメージ処理のスクリプトを作成する
ここまで、アニメーション処理を一切実装してきませんでしたが、ユニティちゃんと敵が衝突した際に何のアクションもないのは流石に良くないので新規アニメーターコントローラーを作りました。
SDユニティちゃんに関するアニメーション作りは以前の記事に書いてありますので参考に。
Base Layerはこんな状態にしてみました。ランニングがベースなので、基本はランニングのアニメーションに設定しています。
2回ダメージを受けたらユニティちゃんの動きを止めるようにするため、Standingのアニメーションも使います。
各パラメータは「Run」がBool型でそれ以外は全て「Trigger」にしています。
作成したアニメーターコントローラーをユニティちゃんにセットしたら、「UnitychanController」スクリプトを修正していきます。
CharacterControllerを利用する場合の衝突判定は、「OnControllerColliderHit」を使う必要があります。OnCollisionEnterなどの関数と間違えないようにしてください。
敵に衝突したら、ライフを減らしてユニティちゃんを0.5秒間気絶状態にします。その間はダメージアニメーションを再生するようにしています。衝突した敵はDestroyで削除しましょう。
気絶している間は、movedirのxとzに0を設定して動かないようにします。また、コマンドも無効にしてジャンプなどの処理も行わないようにします。
敵との衝突時にライフが0になったら、ゲームオーバーなのでStandingのアニメーションに移行してユニティちゃんの動きをストップさせます。
アニメーションのパラメータや、敵オブジェクトのタグ名が異なる場合は、適宜変更しましょう。
スクリプトを保存したらゲームを実行してみましょう。
分かりやすいようにシーンビューとゲームシーン両方を見てみましょう。
敢えて敵にぶつかりに行って各アニメーションの切り替わりと、ユニティちゃんが正しく動作しているのかチェックしましょう。