2軸で狙いをつけるモーション / Unityでレールシューティングの試作経過(3)

右+下向き(ショット直後:弦が緩む)
右+上向き(狙い中:弦が張っている)
リロード中

前回からの更新内容

  • 弦の追加と動き
  • 上下方向の狙いモーション
  • ショット&リロードのモーション
  • 風の表現(髪など)モーション

 前回保留していた複数のモーションを加算合成する方法に挑戦しました。

2軸で狙いをつけるモーション

 弩(crossbow)の向きを上下左右に回転させ、狙いを変化させたいと思っていました。しかし、キャラクター(人体)の姿勢変化は、機械的な砲塔(turret)などと比べて複雑です。一部の関節だけに絞っても、角度を計算的に求めて設定するのは大変です。また、狙う方向によって全身の姿勢に変化をつけたいところです。そこで、狙い(銃口の向きに対する姿勢変化)のモーションを、以下のようなイメージでキーフレームアニメーションを作ります。

水平モーション 左90°〜右90°
垂直モーション 下20°〜上45°

 一般にサポートされるキーフレームアニメーションは、1つの時間軸です。ある1つの軸の回転(全身の姿勢変化)については、その時間軸の時刻に割り当てることで表現できます。狙いの動きは水平と垂直があれば十分といえるので、2つのモーションを作りました。

 これらモーションを合成して「右90° + 上45°」のような動きを可能にしたいわけです。

 加重平均的な「AnimationBlendMode.Blend」で合成すると、中間的な姿勢(「右45° + 上22.5°」のようなイメージ)になります。この合成方法は「モーション間の遷移」(クロスフェード)に使えることは承知していましたが、今回のような目的(複数のモーションの変移量をすべて発動させたい)には適合しないことがわかります。

アニメーションの加算ブレンド

 そこで、「AnimationBlendMode.Additive」です。正しく使うことができれば、「右90° + 上45°」が得られるようになります。
 「AnimationBlendMode.Additive」は、そのモーション内の初期姿勢からの差分方式なので、初期姿勢(時刻0)では「正面を狙う」ようにしておき、それより後の時刻を使って「下〜上」を表す必要があることがわかりました。
 水平モーションが最初にできていたので、これを基本モーションということにして、ほかのモーションを加算させることにしました。加算の活用方法がわかったので、風になびく髪の表現(非物理)なども、ほかのモーションと一緒に使うことができるようになりました。これで、モーションを量産することなく、複合的な動作をさせる方法が確認できました。

 現在は、「水平+垂直+風+行動(ショット・リロード・アイテム使用)」というイメージになっています。「リロード」や「アイテム使用」の動きが自然な姿勢に見えるためには、独占的に動作させる必要があるので、クロスフェードするようにしました。(徐々に銃口を正面に戻す)