はじめに
この記事はUnreal Engine 4(UE4) #2 Advent Calendar 2019の最終日の投稿記事です。
某アニメのあの動きを簡単にですが再現してみようと思い、調べながらですがThirdPersonで実装してみました。
UEのバージョンは4.21.2で実装しました。
実装したプロジェクトはこちらにアップロードしてあります。
[Space]キー:ワイヤーを発射
[D]キー:ワイヤーを切断
[G]キー:ワイヤーの引っ張り状態を変更する
調査
ワイヤーの表現で良さそうなのがないかと調べてみたところケーブルコンポーネントがあったのでこちらを使用しました。
- 公式ドキュメント:Cable Component
CableComponentとは
文字通りですが、ケーブル用のコンポーネントとなっており、パラメータ次第で様々なケーブルになってくれます。
画像はケーブルの長さや幅、重力等を変えています。
今回のワイヤーで使用したパラメータの解説をします。
プロパティ名 | パラメータ解説 | 備考 |
---|---|---|
Attach Start | ケーブルの始端のアタッチするかのフラグ | |
Attach End | ケーブルの終端をアタッチするかのフラグ | 今回はAttach End To関数でグレーマンにアタッチしています。 |
Cable Length | ケーブルの長さ | |
Num Segments | ケーブルのセグメント数 | 1だと曲がらないワイヤーになり、2だと1回曲がるワイヤーになります。数字が大きいほど滑らかに曲がってくれます。 |
他にもパラメータがあり、ゲーム中動的に変更ができるので様々な使い方ができそうです。
実装の前準備
ドキュメントにも記載されていますが、CableComponentを使うには[編集]→[Plugins]→[Rendering]→CableComponentを有効にする必要があります。
実装
ワイヤーが壁に当たったらグレーマンが引っ張られるような制御をしたいので、BP_Wireというアクターを追加しています。
ワイヤーの移動処理にはProjectileMovementを使用しており、壁に当たったかを判定するためのSphereを追加し、ワイヤーとして扱うCableComponentも追加しています。
BP_Wire
BeginPlayでSet Attach End Toで終点をキャラクターにアタッチします。
始点に置いているスフィアが壁に当たったら壁ヒットフラグを立てています。
壁に当たるまではワイヤーを伸ばし続けて、壁に当たったらPull関数内でグレーマンを引っ張っています。
Pull Update関数の下記の部分でグレーマンを動かしています。
AddForceのみで移動をすると移動が速くなってしまうので、Velocityをある程度の速度でクランプをして制御しています。
ワイヤーの伸ばす位置
こちらに関してはいい方法が思いつかなかったので、グレーマンの中央から外に向かって壁に当たるまで総当たりしています・・・。
そのため、地形が限定的でないと使えない状態になっています。
おわりに
カプセルか円柱、DrawDebugLine等でワイヤーを表現しようと思ってましたが、CableComponentがあったので今回使ってみましたが別の使い方としても色々できそうでした。
実際にプレイしてもらうと分かりますが、操作性に難があるのでワイヤーの伸ばす位置と合わせて良い方法が閃けばどこかのタイミングで試してみたいと思います。