ひとことで
アニメーションに含まれる移動(ルートモーション)を、特定の区間だけ伸び縮み・回転させて、動作の決め所がちょうど目標の位置・向きに来るようにする方法です。決まった距離だけ踏み込む攻撃を、近くの敵にも遠くの敵にも当てる、決まった高さの乗り越えアニメーションを、少し高さの違う塀にも合わせる、といったことができます。
ゲームでの使いどころ
- 近接攻撃の吸い付き:踏み込み斬りやタックルを、少し離れた位置や斜めにいる敵にぴったり当てる。アクションゲームの「当たった感」を支える定番の技術です。
- 乗り越え・よじ登り:塀や段差の高さ・奥行きに合わせて、手をつく位置と着地位置を合わせる。
- つかみ・処刑モーション:2 人のキャラクターが組み合う動作で、相手の正しい位置に移動してから開始する。
- ドアを開ける・レバーを引く:手が取っ手に届く位置へ少しずれを補正する。
Unreal Engine には Motion Warping プラグインとして標準で用意されています。
しくみ
- ワープの区間を決める:アニメーションのうち、移動を変えてよい区間(例:踏み込みの始まりから突きの瞬間まで)を、アニメーションに目印として入れておきます。
- 行き先を決める:区間の始まりで、「区間の終わりに本体がいるべき位置と向き」を計算します。突きなら、拳が相手に届く位置から、拳と本体の位置関係を逆算して本体の行き先を決めます。
- 移動を配分する:区間の中で、アニメーションが本来進むはずだった量の割合(進み具合)に合わせて、現在地から行き先への移動を配分します。
はアニメーションに含まれる前進量です。アニメーションがゆっくり進む所はゆっくり、速く進む所は速く、という「動きの緩急」は保たれ、総量だけが変わります。
- 向きも回す:行き先の向きへ、同じ進み具合に合わせて回転させます。
手足の動きそのものは変えないので、アニメーターが作った動作の質を保ったまま、位置だけを合わせられます。
実装のポイント
- 伸び縮みの限度:アニメーションの移動量を 2 倍にも 3 倍にもすると、足が滑って不自然になります。例えば 0.7〜1.5 倍の範囲に収まらない相手には、別のアニメーション(長い踏み込み、短い突き)を選びます。
- 目標が動く場合:相手が動くなら、区間の途中でも行き先を更新し続けます。ただし急に向きが変わると不自然なので、区間の後半では更新を止めることもあります。
- 2 ボーン IK との組み合わせ:位置はモーションワーピングで大まかに合わせ、手や足の最終的な接触は IK で仕上げると、正確で自然になります。
- 衝突の確認:行き先までの間に壁や他のキャラクターがないかを確かめないと、壁を突き抜けて移動してしまいます。
つまずきやすい点
- 区間が短すぎる:短い区間で大きく補正すると、キャラクターが瞬間移動したように見えます。移動の大部分を含む、ある程度長い区間を選びます。
- 回転が速すぎる:真横の相手に向かって一瞬で向きを変えると不自然です。区間の前半で向きを合わせ、後半は前進に集中するなど、回転の配分を工夫します。
- プレイヤーの意図とずれる:狙っていない敵に吸い付くと、プレイヤーは操作を奪われたと感じます。吸い付く対象や距離の条件を慎重に決めます。
デモで試すこと
- 人物は、1.5 m 踏み込んで右の拳で突くアニメーションをくり返しています。赤い相手をドラッグして、近く・遠く・斜めに置いてみてください。
- 「モーションワーピング」がオンなら、相手がどこにいても踏み込みの距離と向きが調整され、左下に「命中」と表示されます。「移動の伸び縮み」は、本来の踏み込み量に対する倍率です。
- オフにすると、いつも同じ 1.5 m だけまっすぐ踏み込むので、相手が近いと行き過ぎ、遠いと届かず、斜めにいると外れます。白い円は、ワープしない場合の着地点です。
- 「相手をランダムな位置に置く」をくり返して、どの位置でも当たることを確かめてください。