ポリプリプリン 2021/01/15 22:15

制作での躓き3(ルートモーションでの移動)

FPS開発の近況ですが、FPSの基本的なシステム(キャラの動作や判定とか敵の行動など)をずっと作っておりました。
いやあ、やる事・決める事が際限なくありますねえ……

今回はその中から、キャラクタをアニメーションで移動させるのに手こずった体験談です。
毎度ながら知識足らずで他に簡単・正しい方法があるのは十分あり得る話ですがご参考になればと思います……
現在の環境:unity2019.3 LightWave2019.1.3


今作ってるFPSでのキャラの歩行などは、モーションはアニメーターで動かし、キャラ全体の移動はスクリプト(キャラクターコントローラー等)で動かしています。
そうするためには、ルートが動かないアニメーションクリップにする必要がありますが、例えば歩くだけでも体が上下に動いたりします。
でもその動きをキャラ全体のオブジェクトの動きに反映するとキャラ全体の衝突判定のコライダも動いてしまうので、ルートのモーションをオブジェクトの動きに反映させないでアニメーションだけさせるようにします。
その設定は、アニメーターでして全てのアニメーションをそう動作させる方法と、クリップ毎に設定してアニメーション別に指定する方法があります。
当FPSではクリップ毎の設定にしています。この方法は、回転・Y軸移動・XZ軸移動それぞれ別の設定にもできるので便利です。

この辺りの話は公式マニュアルや色んな所で解説されているので特に問題なく出来たのですが、躓いたのはここからです。


歩きなどの一定速度で動き続ける動作は、ルートの移動をスクリプトでする方法がいいのですが、尻もちをつくなどの移動速度が刻々と変わる動作は、スクリプトで速度を変化させるのが手間ですし、いい感じの移動量に調節するのも面倒なので、モーションエディタ上でルートの動きを編集したものを使いたくなります。
なので前述のクリップ毎の設定を使い、ルートの移動をモーションでさせたいクリップのXZ軸移動だけ設定を変えました。

ちなみに、モーションでルートを移動させつつ、ボーンとルートの位置関係も動かしたい事もあると思います。オブジェクトの中心を体からずらしたい場合です。


その場合私はクリップのモーションエディタ上でルートだったチャンネルのカーブを編集しています。
Animator.RootTはオブジェクトのルートの動きに使われる(unityにインポートで作られる)のでそのままにします。
インポートしたアニメーションが(Read-Only)で編集できないなら、プロジェクトウインドウでそのクリップを選んでCtrl+Dでコピーされて編集できます。
まぁカーブ編集とか手間をかけなくても、最初にモーションエディタで作る際に空オブジェクトを親として追加して、ルートオブジェクト移動用とアニメーション上だけの移動用に分けておけば問題なかったと思われます……

とにかくこれでアニメーションでのルート移動が出来たと思ったのですが、自キャラと敵で戦闘するテストプレイで問題が発覚しました。
尻もち等でルートが移動する際に倒れる方向と別の方へ移動してしまうのです。
具体的には、キャラがどっちを向いていてもワールド座標での1方向にしか移動しなくなっていました。
これはよく考えれば当然な事ですが、作る側は「後ろに倒れるから後ろに移動させる」と意図しても、モーションには「Z軸マイナス移動」としか記録されないので、キャラが回転してワールド座標上での前方が変わればその移動方向は後ろではなくなるわけです。


この「ルートの移動をローカル座標上の向きに合わせて動かす」事をする設定かツールか何かを探したのですが見つかりませんでした。ゲームを作っててこれをやりたくなる事はよくありそうだと思うんですが……

しょうがなく自前で解決法を考えることに。
初めアニメーションクリップからルートの移動値を読み取って向きを適用して反映しようと思ったのですが、クリップから直接値を読み取るのは出来ないようでした。

なので単純なやり方にしました。
空の子オブジェクトをルートの直下に作り、
それのモーションにルートの移動を写して、
そのワールド座標上の位置の変化をスクリプトで読み取ってルートに反映するという方法です。
元のルートのXZ移動は、オブジェクトの中心をずらす分を残して0にしておきます。
最初の方で変えたクリップのXZ移動の設定は戻します。(どっちでもいいかも?)


これで解決と思ったらまだ問題が出てきました。
アニメーターのステート遷移で別のモーションへ移る時、姿勢が滑らかに変化するよう補間をかけるのが一般的です。
ルートの移動をするステートからしないステートで補間がかかると、ルートの移動用オブジェクトの位置が移動先から原点位置で補間がかかり、意図しないルートの移動が起きてしまうのです。
特定のチャンネルだけ補間しない事はできないので、アニメーターにルートの移動用オブジェクトだけのレイヤーを追加して、そこでは遷移間隔を0にして補間をしないようにしました。


以上でルートモーションの移動が出来たのですが、まだまだ理解しきってはおらず、制作やテストをする内にまた問題が発覚するんじゃないかな~と思います……
ゲームを発表する際はバグが無くなっているよう頑張ります。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索