初心者がUnreal Engine 5でPCゲームを作る Day3 ~ 2Dキャラの基本
Day3まとめ
チュートリアルでUEに慣れる
扱うアセットが2Dなので、まずは2D回りのチュートリアルをやっていく。
今回やるのはこちら。
とてもよくできたチュートリアルで、詰まるところが全くなかった。
画像は自分の作ったアニメーションをpngに出して差し替えた。
チュートリアルを通して把握したUEの特性をまとめる。
Input回りの紐づけ
階層構造
入力マッピングコンテクスト
入力アクション1 ジャンプ
入力アクション2 左右移動
という感じに紐づけていく形式。
入力アクション
入力アクションのファイル(でいいのか? データアセットと呼んだ方がよい?)で設定するのは値の種類だけ。
Bool
1D(直線移動)
2D(平面移動)
3D(VR用)
が設定できる。
マッピング
キー設定などはこっち。
やっていることは「1」を入力するキーの設定。
たとえばX軸で正の方向に動く場合1と入れるが、逆向きに動く場合、
Modifierから「Negate」になるようにキー設定をする。
ブループリント上での宣言
EnhancedInputSystemを使うためにはブループリントクラス上で宣言が必要。
今回は、キャラクターを管理するために作成したブループリントクラス「Paper2D」なるものの上で宣言した。
作成した入力アクションごとにブループリント上で挙動を設定する必要がある。
根本は入力アクション名にして、そこから挙動を引っ張って繋げていく。
ジャンプならジャンプという専用の関数がある。
X軸移動ならワールド上での座標を動かす処理、など。
たぶんSpineのアニメーションもBP上で紐づけしていくんだろうな。
BPの基本挙動を見てみる
ブループリントの挙動がイマイチわかってないのでチュートリアルを参考に確認してみる。
サンプル関数を読み解く
以下の画像はチュートリアルに則って組んだ関数「Flip Turn」で、持たせたい役割は「キャラクターが進行方向を向くようにすること」だ。
大きく分けて以下の2つを行っているということらしい。
Inputの値を受け取り、正の値か負の値かを取得する(紫→灰色)
正ならRotation「0,0」をTargetに与える(水色上)
負ならRotation「180,0」をTargetに与える(水色下)
操作する対象としてselfを取得する
正の時のやつ、負の時のやつにTargetを渡す
Target is PawnのPawnがよくわからんが一旦置いておく
UE内のファイル1個、入力ボックス1個に対して1個のノードを作って操作をしようとするような切り分け方と思ってよさそうだ。
作り方についても、チュートリアルでは頭から組んでいったが、今回のような操作を今後自分が組むとしたら、
やりたい操作のノードを設定
今回で言うと水色のところ
必要な引数を見て条件を設定していく
という手順でやっていくのがいいかもしれないと思った。
ピンの取り扱い
Alt + クリック 切断
Ctrl + クリック つまむ(結合先を変えられる)
無に向かってドロップ 接続先ノードを新規作成
線をダブルクリック Rerouteノードを作成
Ctrl + クリックで移動
ピンを右クリック 次元に分割など
ノードの役割と色
赤で発火
青と緑と灰色が関数・マクロ
関数は必ずターゲット指定が必要
マクロは自分自身がターゲットなのでターゲット指定不要
その他が変数
てな感じで分けられているらしい。
親クラス
ブループリントクラスを作る時には親クラスを設定する。
親クラスは何を制御したいのかによって細分化されており、ブループリントクラス内でできることが変わってくる模様。
今回チュートリアルでは2Dのキャラクターを制御したいので「Paper 2D」を親クラスに選んだ。
テクスチャの設定について
右向きの方がいいっぽい
右がZ座標プラスなので、テクスチャもそちらを向いた状態で用意した方が都合がいいっぽい。
左向かせてしまってるのでエクスポート時に調整するなり関数組むなりした方がよさそう。
方向転換どうする問題
杖の持ち手や腰の本の位置があるので左右で絵書き換えないとダメじゃんということに今気づく。
まあプロトタイプの段階では目を瞑ってもいいか……
気が向いたときに追加して出し分けの方法を調べよう。
Todo 中心座標の設定
Spineで書き出すときには気にした方がよさそう。
中心がズレていると方向転換したときに違和感が出るはず。
Unrealの命名規則
アセット
S_Sprite
T_Texture
BP_Blueprint
IA_Dash
IMC_2DAction
みたいにする。
コーディング規則
アンダーバーつけないで最初大文字でくっつけるタイプ。
UPriitiveComponent
コピペしたけどprimitiveの脱字か……?
次なる目標
基礎の基礎は把握したので実際にSpineファイルを入れてみる。
PaperZDってプラグインを使うのがアニメーション制御に良いっぽいので、これを使う可能性がありそうなら先にPaperZDの学習を。
Spine使うなら使わないよ、って感じならSpineの導入を先にやる。
加えてチュートリアル動画で「動画見ずに0から作ってみましょう」という圧をかけられたのでやらないとかもしれない。
動画を見ずにやって忘却していた箇所
カメラ設定まわり
キャラクターにSpringArmを追加
そこに子としてカメラを追加
SpringArmの設定
カメラがキャラと並行になっているのでZ軸回転-90度
カメラの座標をキャラではなくワールドに対して90度に
たぶんやんなくてもこのチュートリアルなら問題ないのでは
もしかするとキャラの向き変わったときにカメラも回りこんだりするかも。後で試すか
障害物にぶつかったときに回り込む設定「Do Collision Test」をオフに
カメラの設定
パースペクティブを平行投影に
2Dって感じの見た目になる
Ortho With = 1000
たぶんSpringArmってなんやねんになって記憶から飛んでいた。
カメラとキャラの間に置く透明なアームということらしい。
ゲームモード設定
BP作成してキャラをDefaultPawnに
ウィンドウ
ワールドセッティング
ゲームモードオーバーライド
作成したBPをセット
ゲームモードはワールドセッティングから設定するモンだ、と覚えるしかなさそう。
ポストプロセス回り
追加→ポストプロセスボリューム
以下の設定をする
infinite Extent
On
カメラが画面のどこにあろうと、このポストプロセスが適用される
チェックを外すと、溶岩のエリアでは赤いポストプロセス!などができるのだろう
レンズ
Bloom
Threshold
1.0
明るい要素のまわりをボヤっとさせる
エモく光らせるときには世話になりそう
Exposure
露出補正
0.0
明るくトバす効果
上記に同じく
MaxEV100
0.0
MinEX100
0.0
「何かと問題になりやすい」とだけ言われた
Image Effects
ビネット効果強度
0.0
画面端が暗くなる要素を減らす
Misc
色域拡張
0.0
トーンカーブ量
0.0
色味系
「ポスト」というだけあって「あとから」追加するということなのだろう。
ボリュームのツマミを用意するとかけられますみたいなイメージか。
流石にパラメーター覚えるのは無理なのでメモっといてまた必要なら見よう。
BPの各関数名
やってることは朧気に覚えているが関数名を1個も覚えていなかった。
現実的には見ながら書くだろうが、流れを併記しつつ使ったものをメモしていく。
Enhanced Input System使用宣言回り
キャラクターのBPイベントグラフ上で設定
Get Controller
Player ControllerオブジェクトをCastに渡す用
Target selfにして、このPawnにアサインされているものを持ってくる
Cast To PlayerController
Targetはコントローラーオブジェクト
Targetへのアクセスを試みる
存在しなければFailed。PlayerControllerでなくてもFailedだろうか。
アクセスして大丈夫ならそのコントローラーを返せる
Enhanced Input Local Player Subsystem
Targetはコントローラーオブジェクト
TargetからEnhanced Inputの入手を試みる
Is Valid
Targetはなんでもよい
Targetがvalidかどうかをチェックする
今回はEnhanced Input Local Player Subsystemの生存確認用
Cast To~はvalidを内容しているような感じなんですかね
Add Mapping Context
Targetは拡張入力サブシステムインターフェース
↑のアイツとセット運用っぽい
Mapping Contextに設定した奴をブチ込む
ここに置いてある奴をMapping Contextとしてセットする
ここまでをよしなにBegin Playから繋ぐ。
つらつらとメモったけど次回以降コピペでいい気がする。
実装者による調整の余地なさそう。
キーによる発火回り
ジャンプ
IA_Jump
設定したインプットアクションがEnhancedInputAction[設定した名前]でスタートノードにできる
Jump
Startedから繋ぐ
Triggeredにつなぐとおしっぱでジャンプし続ける
Stop Jumping
Completedから繋ぐ
左右移動
IA_Dash
Add Movement Input(Add mで覚えよう)
Triggeredから実行へ
Action ValueからScale Valueへ
World Direction
X = 1.0
Target = Self(Pawn)
入力された値のぶん、Pawnを動かす
動かす方向はX = 1
振り向き
自作関数Flipturn
Compare Float
InputをFlipTurnのノードのない場所に繋げる
Inputを関数外から受け取るように設定
「Pawnにどれだけの入力が与えられているか」をチェック
入力が正の時に右向き、負の時に左向きにRotationをセットするようにする
Get Controller
ここで言うコントローラーとは「Pawnを動かしている存在」のこと
反転させたいPawnを制御しているコントローラーを取得する
キーボード入力を受け取ろうとしているわけではない
Set Control Rotation
TargetはController
PawnのRotationをセットするようControllerに命じる関数
Flipturnへの、移動の接続
実行をAdd Movement inputから繋ぐ
移動するたびにやりたいので
InputをIA_DashのAction Valueから繋ぐ
Get Controllerとキーボード入力は全く関係ないことを見直して気づいた。
使いそうな処理まみれなのでこれは見ずに覚えるまでやっちゃいたい。
Flipbook切り替え回り
自作関数Update Animation
SetFlipBook
New Flipbookに切り替えたいFlipbookを指定
Branch x 2
B + 左クリックで呼び出せる
if式記述用
2つ呼び出してJumpか? Dashか? どっちでもないならIdleとつなぐ
isFalling
空中でTrueを返す
Get Velocity
Return Value X
X座標の移動量を取得する
!
「~でない」
イコールの逆
「移動量」にしていると、壁にぶつかった後はキーを押しても歩き入力が出ない。壁に顔こすりつけて歩ける方がゲームっぽいので「入力している間ずっとダッシュ」にしたいのだがうまくいかない。
一旦今日は時間も時間なのであきらめる。