【Unreal Engine5】初めてのゲーム開発 <第4回>重力制御~Directional & Planet Gravity 使っては見たが…

重力制御に関しては、プラグインで実現させようと考えて調査した結果

《重力関係のプラグイン候補
Directional & Planet Gravity ⇐ 今回使用
Ninja Character Plugin

・Directional & Planet Gravityの動画を見てコレダ!となって導入→チュートリアルがなくて断念
・Ninja Character Pluginを導入するも、思った動作と違う
・Directional & Planet Gravityに戻ってがんばって導入するも試行錯誤
←イマココ


Directional & Planet Gravityに関しては、日本語の解説ページはもちろん、海外の解説ページすらかなり古いものしかなくそのままでは導入できない状態。

プラグイン利用のとっかかり部分だけは成功しましたが、実際の運用方法が難しい。

【Directional & Planet Gravity】
UE5向けの導入解説がない。
・使い方のマニュアルがない。
・(動画を見る限り)細かい調整ができる

【Ninja Character Plugin】
・日本語で解説してくれているページがある
・導入方法は割と簡単

つながっている傾斜を自動で判定してくれる
・球の周りを1周するような挙動は苦手。遠くからトリガーで重力変更とかは(おそらく)できない。



Ninjaの方は本当に軽く触っただけなので、もし間違ってたらすいません。
FPSの壁走りのようにあくまでアクションの幅を広げる用途での利用に特化してる印象。

目次

Directional & Planet Gravityはどんなプラグイン?

公開して下さっているのはsteamゲームの Astro Colony 開発者。
また、使用例の動画(英語)も公開して下さっています。

Free Directional gravity, gravitatation like Planetary Anihilation

球体に固有の重力を持たせることが出来たり、2:30~をみるとトリガーによって重力の向きを変えたりしています。
面白い使い方できそう!
おそらくAstro Colonyのシステム用に作成したプラグインだと思いますが、無料公開して下さっているのは本当にありがたい。

前述の通り、詳細な解説ページがほとんどなく、唯一あるのがこちら
Directional & Planet Gravity

2024/4/18追記

最近導入に関するチュートリアル的な記事が更新されたようです!(内容はきちんとはみてないですが)

内容に関しては、リンク先のページ左側タブより、「Directional & Planet Gravity」を参照してください。

画像が少ないのでやや分かりづらい印象ですが、今後の更新に期待 🙂

※英語なので機械翻訳推奨

この通りやってもUE5.3.2では動作しません(書かれてる関数がなかったりもする)。
見ていくうちに内部関数(Set Gravity Dir)のコール方法だけは分かったので、今回使うのはあくまで最低限動作する方法となります。

自在に操作するには細かい調整は必要ですが、使い方によってはかなり幅の広い使い方ができるプラグインと言えそう。

使用しているバージョン

Unreal Engine 5.3.2

Directional & Planet Gravityのインストールと有効化

プラグインページにて

「ランチャーで開く」の部分が最初「Free」になっていると思いますのでクリックして入手。

UEの「ライブラリ」画面にて、プラグインがインストールされていることを確認
「エンジンにインストールする」をクリックして、既にインストールされていると表示されればOK。


プロジェクト起動後にプラグインを有効化

プロジェクト画面の上部
編集 > プラグイン > インストール済み

対象のプラグイン(Directional & Planet Gravity)にチェックマークをいれて再起動



プラグインはもっていても、有効化しないと効果がありません(ドラクエ風)。

操作キャラ(BP_ThirdPersonCharacter)の設定

サードパーソンの初期キャラである「BP_ThirdPersonCharacter」の親クラスを変更する必要があります。

BP_ThirdPersonCharacterをダブルクリックor編集。

上のタブを「クラス設定」に合わせると、詳細ウィンドウに「親クラス:Character」が表示されるので、プルダウンから検索して「BP_GravityCharacter」に変更します。

親クラスを変更したせいか、最初に配置されている青ブロックを動かせなくなっていたので、BP_ThirdPersonCharacterの詳細パネルの「Enable Physics Interaction」にチェック。

他にも変更されている部分があるかもしれませんので、挙動がおかしかったら詳細ウィンドウで調査。

重力操作関数を作成

プラグインを有効化し、親クラスを変更すると、Set Gravity Dirという重力を変動させる関数が使えるようになります。

BP_ThirdPersonCharacterで重力操作用の新規関数(Uf_Gravity_UP)を作成
マイブループリントウィンドウの下の方に「関数」という項目があるので、右にあるプラスボタンで追加。

名前に関しては、後の処理と整合性が取れれば好きに変えてもらって構いません。

Uf_Gravity_UPのノードプログラムを作成

《完成図》

①Get Gravity Movement Componentで重力情報を取得 ※プラグイン導入で使用可能になる関数
②Set Gravity Dir(重力設定関数)に繋ぐ
※プラグイン導入で使用可能になる関数

その際、①のデータワイヤーから先に繋ぐか、「状況に合わせた表示」をオフにしないと出てこないので注意。
構造体ピンに関しては、必要に応じて右クリックメニューから「構造体ピンを分割」

③残りの関数やワイヤーを上画像のようにつなぐ
Add Relative Rotation(向きの調整関数)や、Add Relative Location(位置の調整関数)は非プラグイン時でも使える関数。
Add Relative Locationはカメラ位置を微調整しているだけ。

Mesh/Follow cameraに関しては、マイブループリントのものをイベントグラフ上にD&D

④ Set Gravity Dir(重力)/Add Relative Rotation(キャラの向き)/Add Relative Location(カメラの位置)の数値を調整
上の画像の設定は、上下逆の重力にしてキャラの方向も調整したもの。
逆転時に視界も逆転する場合はcameraのRotationも変える必要がある。

トリガーを作成

今回はシンプルにアクタに触ることをトリガーとします。
ボックス等のアクタで作成してもいいのですが、開発者の方の紹介ページのような文字アクタに。
今回の話と関係なく、画面上に好きに文字を書けるのは便利。

Text 3Dプラグインを有効化

編集 > プラグイン から、検索してチェックを入れて再起動

トリガーとなるアクタを作成

①適当なフォルダで空のBP(アクタ)を作成

② 対象となるアクタの造形

Text 3Dだと当たり判定のイベントがないようなので、当たり判定としてBox Collisionを追加

③ 上で作ったcollisionに対しOn Component Begin Overlapでイベントを作成

Cast To BP_ThirdPersonCharacterの役割は
入力されたObject(OverlapしたActer)がBP_ThirdPersonCharacterの場合、BP_ThirdPersonCharacterとしてUf Gravity Upの関数を実行するというもの。

つまり、Cast To BP_ThirdPersonCharacterを挟むことで、Uf Gravity UpというBP_ThirdPersonCharacterの関数をBP_upから呼び出すことが可能になります。

Object(Other Actor)はなんでもいいわけではなく、関係ないアクタがCast To BP_ThirdPersonCharacterを呼んでしまうと失敗(Cast Failed)します。

プレイヤー以外のアクタによる起動(例えばボールを投げて起動する等)を考えると、明示的にプレイヤーキャラを渡してあげた方が良いかもしれません。

《実行テスト》

④既知の問題点
上下逆さまになるとジャンプができない
ジャンプに関しては一応下記設定がありますが、これより詳細に調整するにはC++としてのコーディングが必要なのでしょうか?

側面方向(4面)への重力発生時にプレイヤーが壁を上下移動できない
側面方向(4面)への重力発生時にプレイヤーのRotationの指定方法が分からない

前者は修正方法の検討もつかず。
ただ、開発者の方の動画(3:10~)をみるときちんと動作できているので解決法はあるはず。
後者はRotation系の関数を色々触って調整していますが 難しい。

⑤ さらに高度な設定

重力操作によってカメラも上下逆さまにするのはよくあるギミックですが、Add Relative Rotation(follow camera)で実装できそうです。
ただし、キー入力の変更も必要なので結局C++によるコーディングもおそらく必要。

Set Gravity DirのXYZ設定値について

・X
正の数値:X軸方向への重力が発生
0:デフォルト(重力発生なし)
負の数値:X軸の反転方向への重力が発生


・Y
正の数値:Y軸方向への重力が発生
0:デフォルト(重力発生なし)
負の数値:Y軸の反転方向への重力が発生


・Z
正の数値:上への重力(反転
0:デフォルト(通常時の重力)
負の数値:下への重力(ジャンプ力減少?)

Zに関してはデフォルトが0(下への通常重力)だが、XYに0以外の数値が入っていた場合、Z方向重力は消滅する(ように見える)。

先のようなサイコロ型キューブ(裏面に④⑤⑥)の各面が重力面となるような設定を考えてみます。
Set Gravity Dirに関しては以下のような設定で可能。

① Set Gravity Dir(-1,0,0)/
② Set Gravity Dir(0,1,0)
③ Set Gravity Dir(0,0,0) ※(0,0,-1)だとジャンプ力減少?
④ Set Gravity Dir(0,0,1) ※③の裏面
⑤ Set Gravity Dir(0,-1,0) ※②の裏面
⑥ Set Gravity Dir(1,0,0) ※①の裏面

数値に関しては-1,0,1以外でも可能。
重力が増えるとかあるかもしれません(未確認)。

・ Add Relative Rotation
Rotation系の関数は元々UE5に入ってる関数ですが、種類も多く使い方もまだよくわかってない状態。
とりあえず上下反転だけはできましたが、まだ試行錯誤状態。
Rotation系はこれ以外にもいろいろあるのでどれを使うのがいいのか。

最後に

《現状(動画)》

動くだけは動かすことはできましたが、思い通りとはいかず。
ジャンプがZ軸方向(通常重力のジャンプ方向)のみ。
特に最後の側面(面1)では実は上下方向に移動できない2D移動状態だったりします。
無念

Directional & Planet Gravityに関しては、(解説がない以外は)良いプラグインだと思うのですが、なぜか海外サイトでも解説してくれているところが見当たらないんですよね…重力操作系のゲームって面白いと思うんですが。
興味を持たれた方はチャレンジしてみてください。
中途半端に動いてしまったので、私ももう少しあきらめずに触ってみたいと思います。
出来ないことを動画にはしていないと思いますので、きちんと使いこなせば動画のような重力制御ができるようになるはず。

ジャンプ/壁面走りに関してはC++ファイル(/Engine/Source/Runtime/Engine/Private/Character.cpp)をいじる必要がありそう?
動画では壁歩きは普通にしていたので、やり方次第で出来そうな気はしているんですが。

Directional & Planet Gravity(旧バージョンを解説してくれてるページ)の後半

この辺りをきちんと組みこめれば解決するのだろうか…

自分の知識不足が身に染みたので、基礎から勉強し直してきます。

次回更新は未定。

そろそろちゃんとしたゲームプレイ系の記事更新も考えないと(笑)

コメント

コメントする

目次