あきばっぱら1.1 ユニティちゃん大ジャンプ

Unity Web Player | Akibappara1.1
ユニティちゃん大ジャンプ

 

前回からの変更点は、

  • ユニティちゃんが大ジャンプできるようになった
  • ユニティちゃんボイス導入(ジャンプ時と休憩時)
  • 世界の壁をPlaneからCubeに変更
  • 世界の果てから落ちたら、初期位置に戻るように
  • 表示色の調整

大ジャンプ以外はあちこちggってわかった内容をちょいちょい組み合わせて、それほど苦労なく作れた。

ユニティちゃんボイスは、ジャンプ時と休憩時用にList<AudioClip>を2つ用意して、
ボイスをそれぞれ3種類くらい登録し、再生する時にその中からランダムで一つ選ぶ作りに。

大ジャンプはわりと結構超苦労した・・・
ある程度までは何となくこんな感じじゃないかなーで作ったんだけど、
そうするとやっぱりバグが取りきれなくて、キーボード押しっぱなしだと大ジャンプの頂点でさらに大ジャンプしようとしたり、
着地後までキーボード押しっぱなしだと今度は大ジャンプせずに普通のジャンプしかしてくれなかったり。

 

以降作ったジャンプ処理の解説

前提条件

  • 「キャラの足元から地面までの距離」を常時監視している
  • この「地面との距離」は、立っている間常に同じ数値・・・ではなく、ある程度の数値のブレが常に存在するので、
    立っている状態から「地面との距離」を使って何か判断するためにはこの「ブレ」を吸収する必要がある
  • 「地面との距離」は過去10点の数値を保持し、毎ループ各数値の差を計測することとした
    古い点から新しい点の差を取得し、マイナスだったら上昇中としてプラス1点、プラスだったら下降中としてマイナス1点の集計を行っている
  • 数値が10点なので集計は9回行われ、最小マイナス9点~最大プラス9点までの集計結果が毎ループ計算される
  • 立っている状態の「ブレ」だと、マイナス3点~プラス3点くらいの間を行ったり来たりする

実際のジャンプ処理

  • ジャンプキーが入力されたら、ジャンプ開始としてジャンプステートへ移行
  • ジャンプモーションを作動させ、ジャンプ用の上向きの力をRigidbodyに加える
  • 「上昇中」だと判断できる状態になって、ジャンプキーの入力がまだ続いている場合は、大ジャンプへ移行する
    (ジャンプキーの入力も、過去数点を集計して連続性をチェックしている)
  • 大ジャンプでは、上昇中かつジャンプキーの入力が続いている間、ジャンプ用の上向きの力を加え続ける
  • が、そのまま力を加え続けると、どんどん加速していってどこまでも上昇し続けていくので、上向きの力を加えるごとに、加える力を現象させていく
  • Animation側で、下降モーションに入るとイベントを発行するように設定してあるため、そのイベントを使ってアニメーション速度を一旦ゼロにする(大ジャンプではここが超重要)
    アニメーション速度をゼロにするとモーションの進行が止まるので、着地時に再開すれば地面に着くまでは下降モーションでいてくれる
  • 「地面との距離」は常時監視しているので、ジャンプ開始後にコルーチンでこの値を随時チェックし、立っている状態の「ブレ」の範囲まで落ちてきたと判断したら「着地した」として着地硬直後、ジャンプ処理を終了

ジャンプキーの入力は、ジャンプ中以外かつ落下中以外でないと受け付けないとか他にもいろいろあるけど、基本的にはこの流れで出来るはず。
他にもジャンプ中ステートを更に細分化して「ジャンプ前待機中」「上昇中」「頂点付近」「下降中」「着地硬直中」に分けたりしてるけど、大ジャンプし続けるか終わるかの判定がうまく出来るならたぶん必要ない。
このへんはどういう作り方したいかで変わってくるかと。
僕の場合は「ジャンプ前待機中」~「頂点付近」の細かい区別が出来なくっていろいろバグってたので、条件分岐にこの細分化したステートを使わないとうまいこと動いてくれなかった・・・

 

●参考資料
Unity3D – mecanimのアニメーションイベントで、ジャンプしてから着地するまでを自然に表現する – Qiita
Unityのゲーム画面を綺麗にするライティング – テラシュールブログ
大変わかりやすくてすごく参考になって助かりました。ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です