📄

【UE5】ゲームパッドのスティックでIKを動かしてみた

に公開

はじめに

コントロールリグで設定した腕のIKをゲームパッドで動かしてみました。
位置固定のキャラクターの手を動かして遊ぶゲームのイメージです。![]

※左右の腕をそれぞれのスティックで動かしています。

こちらの実装方法について紹介します。
UEのバージョンは5.6です。

1.キャラクターの準備

ブループリントの作成

配置するキャラクターのブループリントを作成してレベルに配置します。
アニメーションはサンプルの待機アニメーションを使用しました。
腕の位置は後でコントロールリグで調整するのでこの段階では何も行いません。

ワールドセッティングの設定

ワールドセッティングのデフォルトのボーンクラスに、作成したブループリントを設定を行ってプレイヤーとして動せる状態にしています。

2.ブループリントでスティックの入力方向の値を取得

Enhanced Inputで実装しています。
こちらの記事を参考にさせていただきました。
https://zenn.dev/posita33/books/ue5_starter_cpp_and_bp_001/viewer/chap_80_5_01_bp-enhanced_input

InputActiontで左右のAxisを作成

左右それぞれのInputActiontを用意、ValueTypeはAxsi2D(Vector2D)にしています。

InputMappingContextの作成

InputMappingContextに作ったInputActiontを登録しています。
Scalarの値は基本1.0ですが、右スティックのYだけ-1.0にしています。

この設定でスティックを倒したときに以下の値が取得できるようになります。
上:1.0, 下:-1.0
左:-1.0, 右:1.0

ブループリントで作成したMappingContextを設定

作成したContextをキャラクターのブループリント内で設定します。

  • 「EnhancedinputLocalPlayerSubSystem」ノードを作成して、「GetPlayerController」ノードをを接続
  • 「AddMappingContext」ノードを作成して、targetに「EnhancedinputLocalPlayerSubSystem」を接続

上記のように設定すると作成したInputActiontが表示されるようになります。

変数に入力値を設定

ブループリントに「左スティックのX値」「左スティックのY値」「右スティックのX値」「右スティックのY値」を設定するための変数を作成しています。

スティックに入力があるとEnhancedInputActionイベントのTrigeredが起動するので、ActionValueをBreakVector2DでXとYに分解して変数に記録します。またスティックを離して初期位置に戻った時に確実に値をリセットしたいので、Completedでも初期値の0を入れなおしています。
これを左右で作成しています。

この変数をブループリント→アニメーションブループリント→コントロールリグという流れで渡していきます。

3.コントロールリグに値を渡す

アニメーションブループリントとコントローラーリグにも同じ変数を作成して受け渡しを行っています。まずはアニメーションブループリントではキャストして取得したブループリントの変数の値を受け取り、

その変数をさらにコントローラーリグの変数に設定することで、コントロールリグでもその変数を使用できるようにしています。

4.コントロールリグを作成

腕のIKとコントローラーを作成

両腕のエフェクターとポールベクターのコントローラーを用意して、BasicIKノードでIKを入れています。

コンパイルしてコントローラーで動くようにしたら、手を前にしたポーズにしてコントローラーのデフォルト位置に設定します。ここで設定した手の位置が初期位置となるため、上下左右に動かして変にならない場所にしておく必要があります。

手首の回転を設定

手首は正面のカメラに向けて固定したかったのでエフェクターのコントローラーと接続しています。

スティックの入力値をIKに反映

スティックの入力値を使ってIKのエフェクトコントローラーの位置を変更しています。
例えば「leftAxisValueX」変数にはスティックの左右の入力値が「-1~1」の範囲で入ってくるので、その値にmultiplyで値を掛けて「-20~20」の値にします。それをコントローラーの位置に加算して位置を反映しています。

まとめ

今回はただ腕を動かすだけでしたが、腕の連動して身体も動くようにすればもっと自然な動きにできると思います。今回紹介した実装方法以外に様々な作り方があるかと思いますので、参考としていただけたら幸いです。

Discussion