ブロック崩しを(一応)終えたので、新しい題材でまたUE5を触っていきます。
今回は目的があるわけではなく、目的となるようなゲーム探しの為に行き当たりばったり試行錯誤。
レースゲームになるのか、遊戯タイプになるのか、パズル系になるのか…
《今回の記事後の実行テスト》
・スペースキーを押す度に進行方向に向かって100加速
・現在の速度を表示
・円形ゲージの調整は未実装
・移動方向の指定は未実装
使用しているバージョン
Unreal Engine 5.3.2
ボール型のプレイヤー作成
親クラスを何にすべきか?
Pawn/Character/DefaultPawnの3択+α
Pawn
特に設定はなし。
移動方式の設定はないが、コンポーネントとしてFloatingPawnMovementが用意されている。
FloatingPawnMovementはDefaultPawnのMovement Componentに近い挙動(キー入力マッピングは必要)。
Character
デフォルトの所持コンポーネント
Skeletal Mesh Asset+Collision(シリンダー型)+Arrow
Character Movement での移動設定が適用される(イベントグラフ設定は必要)。
Simulate Physicsは設定不可(デフォルトで重力や衝突判定が適用されている?)
SkeltalMeshAssetで人型以外に設定することも可能で、シリンダー型はCapsule Half HeightとCapsule Radiusの数値を等しくすることで球型にすることは可能。
もしCube型Collisionにしたいのであれば、外側をCube Collisionで覆ってそちらで判定。
残念ながらSphere型のSkeletal Meshはデフォルトでは用意されていないのでSphere型にしたいのであれば自分で用意する必要がありそう。
DefaultPawn
デフォルトの所持コンポーネント
Static Mesh(デフォルト球型 変更可)+Collision(球型)
Movement Componentの移動設定が適用される。
イベントグラフなしでもWASD移動/スペース(浮上)/C(下降)等が設定されている。
飛行アクタにとっては便利ではあるが、変更したい場合はC++での編集が必要。
Simulate Physicsは設定できるが反映されない(重力等の設定不可)?
結論
Character(親)はCharacter Movementが用意されていてデフォルトで他のアクタに物理干渉できるが、Skeletal Meshを用意する必要がある。
それでも(WASDで)動かすだけならCharacterが最も楽だと思いますが、せっかくボール型にするのだから転がりたい。
DefaultPawn(親)はなぜかデフォルトで移動設定がされているので飛行タイプの親としては優秀だが、Movement Componentの移動方式では他のアクタに物理干渉できない。
今回はPawn(親)で作成することにしました。
Pawn(親)でとりあえずボールを動かしてみる
Static Mesh :Sphereを設定
Sphere Collision
SpringArm:ThirdPersonCharacterからコピー
Camera:ThirdPersonCharacterからコピー
FloatingPawnMovement(コンポーネント追加)
Static Meshの詳細パネルSimulate PhysicsをON
イベントグラフ(キー入力)はThirdPersonCharacterをコピペ。
ただし、Jumpはコピーしなくてよい(画像ではワイヤーだけ切ってます)。
ボールの模様は回転が分かりやすいようにつけました(無料アセット:Necro’s Utility Material Pack使用)。
これで動かすことはできる(とりあえず見た目上では)。
ただ、(FloatingPawnMovementでは)運動エネルギーが発生しないので回転はしないし、他のアクタに物理法則的な干渉ができず、干渉されない(hit判定は可能)。
他のアクタに干渉したければFloatingPawnMovement以外の移動方法を実装する必要がある。
物理演算をつかった移動方式に変更
ぶつかった反動とかで遊びたいので、FloatingPawnMovementは没。
ブロック崩しで使ったAdd ImpulseやSet Physics Linear Velocityを使いながら移動していく方式を採用。
FloatingPawnMovementはテスト用に一応残しておきますが、不必要になったら削除。
今回のボール制御用の物理マテリアルを作成し、紐づけます。
必須ではないですが、物理マテリアルをいじったほうが自分好みの挙動にできる。
Friction(表面摩擦)を0にしてしまうと、ボールの回転もなくなってしまうため0.1に。
Restitusion(反発力)はとりあえずデフォルトのまま。
紐づけはボール(BP_PlayerBall)のPlayerSphere(Static Mesh)の詳細パネルで行います。
速度メーター
今回使用するファイル
BP_LevelProcess(Actor):レベルを通じた設定等を記載するブループリント
M__RoundGauge(マテリアル):円形ゲージ
M__RoundGauge_Inst(マテリアルインスタンス):円形ゲージのマテリアルインスタンス
WBP_Gauge2(User Widget):円形ゲージと速度メーターを設定
円形ゲージに関しては今回は形だけ(Event Tickで変動)。
将来的に溜めゲージとして使用する予定なのでwidgetだけ先に作成しました。
仕様
①現在の速度を表示する
②ゲージ部分は今後実装(今回は時間経過で変化するだけ)
ゲージ部分はナンチャッテ仕様ですが、今後のことを考えて先に実装してみました。
普通のレースゲームであれば、速度と連動させてもいいと思いますが、今回は別の用途で使用予定。
方法は《UE5 円型プログレスバーを作ってみる》が大変参考になり、勉強になりました。というかほぼパクってます
上の記事で詳細に解説されているので、ここではやや簡易的な説明にしています。
今までSurfaceしか使ってなかったMaterial Domainですが、他にもいろいろ種類があったんですね@@;
今回使うのはUser Interfaceで出力ピンの種類が変化します。
ただでさえ難しい部分なのに奥が深い。
M__RoundGauge(マテリアル)
ほぼ解説のまま。
右上部分だけ、Lerp(L+クリック)を使って色変化を付けたくらい。
MaterialのMultiplyは今まで意味がわからなかったのですが、やっとイメージ(A∩B)がつきました。
Geometry ScriptのIntersection(結合)みたいな感じ?
M__RoundGauge_Inst(マテリアルインスタンス)はM__RoundGaugeを右クリックからマテリアルインスタンスを作成するだけ。
WBP_Gauge2(User Widget)
デザイナー
配置が分かりやすいようにCanvasPanel追加。
速度計(Text)を追加。
Is Variableのチェックと
Justificationを中央に。
グラフ(SetPersent)
グラフ(EventTick)
後半部分(ほぼ解説のまま)に関しては、後で処理を変える予定なので解説省略。
Cast To BP_PlayerBall | PlayerPawnのインスタンスを取得しています。 変数に昇格していますが、いらなかったかも。 |
Get Physics Linear Velocity | PlayperPawnのインスタンス⇒Player Sphere(Static Mesh)の保持する運動エネルギーを取得。 速度 = Vector Length×0.1を速度としてTextに変換(小数点以下は丸める)。 |
SetText (Text) | Is VariableしたTextBlock_Speedに設定 |
BP_LevelProcess(Actor)
ほぼ解説のままです。
ボールの加速
今回は、ボールの進行方向への加速処理
流れとしては、進行ベクトルを取得して、その方向に対して一定の力で加速させる。
今回使用するファイル
BP_PlayerBall(Pawn):Default Pawn Classとして使用するプレイヤー
キー入力マッピングの登録と、カメラの移動。
この辺りはThirdPersonCharacterからコピペ。
続いて加速キー(スペースバー)を押したときの処理。
Enhanced Action Events IA_Jump | IA_Jump(スペースバー)で加速させる。 流用してるので名前は合っていない。 Do Onceでキーが離されるまで1回のみ処理。 |
Get Physics Linear Velocity | Player Sphere(Static Mesh)が保持する運動エネルギーを取得 |
Normalize | 運動エネルギーのベクトル(方向)はそのままに、大きさを1(単位ベクトル)にする。 |
Branch | 所持している運動エネルギーが0の場合の分岐(初回のAdd Impulseへ) |
Add Impulse | 初回:X軸方向に2000の運動エネルギー 2回目以降:単位ベクトルの向きにSpeed Boost(変数:デフォルト1000)の運動エネルギー |
コメント