ゲーム プログラミング

Unreal Engine5の備忘録(初心者向けの忘れがちなTIPS)

お久しぶりです、もみじばです!

長らく音楽制作にほぼ全振りしてたのですが、だんだんゲームを作りたくなってきて、最近ついにUnreal Engine5でのゲーム制作を始めました。

にわとりが卵を発射して海賊や忍者を倒したり、スーパーの店員を倒すゲームをつくろうと頑張ってます。

さて、話を戻します。

Unreal Engineは超有能ソフトなのですが、難易度はそれなりに高いです。設定項目が大量にあるのと、作業内容によって編集画面のUIもガラッと変わるので、一度覚えたことでも「あれってどこだっけ?」とか「あれってどうやるんだっけ」みたいになることが結構あります。

そういったちょっとしたTIPSを自分用の備忘録としてメモることにしたのが、この記事です。もしかしたら困っている誰かを偶然助けることもあるかも知れません。

ただ、この手の記事によくある免罪符ですが、自分用なので間違っている可能性があったり、雑だったりすることがあるのでその辺ご留意ください。

Unreal Engine5 備忘録(初心者用TIPS)

カニ歩きさせたい

Characterアクターの以下項目をON/OFFするとできるはず。

以下をそれぞれ同時に複数ONにすると、競合して意図しない挙動になることがあるぽい。

Use Controller Rotation Yaw

キャラクターの向きが常にカメラの方向に一致する。

そのため、カメラの向きを変えずにキャラクターを左右に移動させると、カメラの方向を向いたまま移動する。

逆に移動しながらカメラを回転させるとキャラクターもそっちを向いてしまうので、カニ歩き感はなくなる。

Orient Rotation to Movement

キャラクターの向きがキャラクターの移動方向に自動的に合う。

そのため、この項目をOFFにすれば向きと移動方向が合わないカニ歩きを実現できる。

Use Controller Desired Rotation

Orient Rotation to Movementとごっちゃになるが、こちらはAIキャラクターに使うことが多いらしい(本当かちょい怪しい)。キャラクターの向きがキャラクターの移動方向に合う…という点は同じようだが、一瞬で変わるのではなく、なめらかに向きが変わるのが特徴。

うまく行かない場合、この設定が競合しているかも知れない。

ルートモーション

位置移動のあるアニメーションは「ルートモーション」をONにすると、アニメーション再生時にその移動が反映されます。

ルートモーションは「アニメシーケンス」の「Enable Root Motion」という設定項目でONにできます。アニメモンタージュではないことに注意!

また、位置移動がないアニメーションのルートモーションをONにすると、自分のプロジェクトではアニメーション再生中に移動操作を受け付けなくなった。攻撃アニメーションなど、アニメーション中に移動させたくない場合はルートモーションをONにすると移動制御が楽。

ただし、ジャンプ中に位置移動のないルートモーションONのアニメーションを再生すると、急に位置が止まってかなり違和感が出る(ジャンプによる高さの移動はそのままだが、前後左右の移動が急に止まって変)。

その辺は他の設定やブループリントでどうにかできるのかも知れないが、備忘録なのでメモとして書いた。

物理ONとプロジェクタイルの関係

プロジェクタイル(飛び道具)の「Simulate Physics」をONにすると、Projectile Movement Componentの一部設定が無視される。基本のInitial Speedも無視されるぽい。

以下はChatGPT4に聞いた回答を基としているので、正確性は怪しい。ただ、物理をONにすると全体的に色々設定は無視されるのは事実っぽい(そうじゃないと物理ONにする意味がないのかも)。

  1. Initial Speed(速度): 物理がONの場合、オブジェクトの速度は物理エンジンによって計算され、Projectile Movement Component によって設定された速度は無視されます。
  2. Acceleration (加速度): 物理エンジンがオブジェクトの加速を制御するため、Projectile Movement Component による加速度設定は無視されます。
  3. Projectile Gravity Scale (プロジェクタイルの重力スケール): 物理がONの場合、オブジェクトの重力は物理エンジンによって制御されるため、このコンポーネントの重力スケール設定は無視される可能性があります。
  4. Bounciness (反発係数): 物理エンジンによって衝突応答が管理されるため、Projectile Movement Component による反発係数の設定も無視されることがあります。
  5. Friction (摩擦): 同様に、物理エンジンによって摩擦が計算されるため、Projectile Movement Component の摩擦設定は無視されることがあります。
  6. Homing (ホーミング): ホーミング機能も物理エンジンの制御下にあるため、物理がONの場合は正常に機能しない可能性があります。

物理をONにすると、Projectile Movement Component は主に初期の投射設定(発射の方向や初速など)に使用され、その後の動きは物理エンジンによって制御されます。したがって、物理エンジンの挙動を理解し、適切な設定を行うことが重要です。

ワールド座標とローカル座標に注意(特にVector・Velocity関連)

Vectorが思った方向にならない! という場合は、恐らくこのワールド座標とローカル座標のせい。

まず、絶対的な座標としてのXYZがワールド座標として存在する。東西南北のような感じで、常に北がX、みたいな。

一方、各アクターにとってのXYZがローカル座標で、これはアクターの向きに連動して変わる。前後左右というイメージ。

VectorやVelocityをXに設定したらアクターの前方になるはずなのにならない! という場合は、ワールドのXにしている可能性がある。そうすると、アクターの向きに関わらず、常にワールドのX方向になってしまう。

ワールド座標のVelocity

Set Velocity」ノードで設定。個人的にはあまり使う場面が思い付かない。

ローカル座標のVelocity

Set Velocity in Local Space」ノードで設定。

ローカル座標系のVectorをワールド座標系に変換

前方向を取得したい場合は「Get Actor Forward Vector」、それ以外の場合は「Get Actor Rotation」といったノードを使うとよい。

例)

攻撃が当たった敵を、攻撃を当てたキャラにとっての前方に吹き飛ばしたい場合などは、

・攻撃を当てたキャラの前方を「Get Actor Forward Vector」で取得

・それと吹き飛ばしたい量(1000とか5000とか)をMultiplyノードで掛け算

・それを「Add Impulse」のImpulseピンに(ワールド座標でしかImpulseを設定できない)に接続

みたいな感じで実装できる。たぶん。

アニメーションと連動してイベントを起動する方法

基本的に、AnimNotifyやAnimNotifyStateという機能を使う。

アニメーションのタイムラインに設置すると、設置したフレームで通知が行ってイベントの起動とかに使える。

AnimNotifyは点(1フレーム)で、AnimNotifyStateは開始から終了までの期間を指定するイメージ。

説明が下手なので他人様のブログからも説明を引用させていただきます。

NotifyではAnimation Sequenceの特定ポイントでイベントを通知することができます。Notify StateではAnimation Sequenceで特定ポイントを二点設定することで開始と終了時にイベントを通知し、二点間でもアニメーションがアップデートされるたびにイベントを通知することが可能です。

[UE4] 独自のAnimation Notifyの実装方法|ヒストリア

AnimNotifyの使い方例

やり方は色々あるが、たとえば以下のような方法がある。

・Anim MontageにMontage Notifyを追加
・AnimBPでそのNotifyをトリガーにBPのカスタムイベントを起動
 (AnimBPからBPをCastし、任意の変数に情報を入れておく必要あり)
・BPでカスタムイベントの内容を設定

モンタージュを再生するノードにNotifyピンがあるので、そこと接続して使うこともある。

AnimNotifyStateの使い方例

やり方は色々あるが、たとえば以下のような方法がある。

・Notifyクラスのブループリントを作成して、関数のReceived_NotifyBeginとReceived_NotifyEndでノードを組む
・それぞれの関数内でBPにCastし、そのBPのカスタムイベントを起動
・BPでカスタムイベントの内容を設定

AnimNotifyのように、モンタージュを再生するノードのNotifyピンと接続して使う方法もある。

例)

たとえば、剣で攻撃するアニメーションがあったとする。

剣に当たったらダメージを受けるようにしたいけど、当たり判定は剣を振ってるときだけONにしたい(剣を振りかぶってるときに剣に当たってダメージを食らうのは違和感がある)。

そんなときは…

・攻撃をするキャラクターに、当たり判定ON/OFFの判定をするbool型変数を作成(仮に変数名をIsHitActiveとします)

・攻撃をするキャラクターのBP側で、IsHitActiveがTRUEの場合だけ当たり判定処理を行うようにする

・攻撃アニメーションのモンタージュ編集画面に入り、「Montage Notify Window」を剣を振っているあたりに設置

・当たり判定ON/OFFに使う、Notifyクラスのブループリントを作成

・Received_NotifyBegin関数とReceived_NotifyEnd関数があるので、Beginの方で当たり判定ONにするノードを組む。同様に、Endの方では当たり判定OFFにするノードを組む(攻撃するキャラクターにCastし、IsHitActiveをTRUE/FALSEにする)。

NotifyクラスのBPから攻撃キャラクターの変数を直接いじるよりも、攻撃キャラクターBP内のカスタムイベントを起動させて、そのカスタムイベント内でIsHitActiveをON/OFFしてもよい。

また、そもそも敵が何種類もいる場合はインターフェースという機能を使う方が便利だったりするが、Notifyの使い方は似た感じ。

ロックオンシステム

Target System Component Pluginというプラグインを使うと簡単に実装できる。

キャラクターBPにTargetSystemコンポーネントを追加し、そこで色々設定できる。

Enable Auto Blend

アニメーションの設定。これをOFFにすると、アニメーション終了後に最終フレームのまま固定できる。(アニメーション終了後に元のアニメーション(ポーズ?)にアニメーションがブレンドして戻っていく…ということが行われなくなるせいだと思う。)

複数のアニメーションを連続して再生する際に、もしかするとOFFにした方が自然になることがあるかも。OFFにしないと、アニメーション終了時に一瞬元のアニメーションに戻ろうとするので変な感じになったことがある。

まとめ

今後ももしかしたら追記するかも知れません。