見出し画像

初心者が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の命名規則

アセット

[AssetTypePrefix]_[AssetName]_[Descriptor]_[OptionalVariantLetterOrNumber]

  • 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座標の移動量を取得する

  • !

    • 「~でない」

    • イコールの逆

「移動量」にしていると、壁にぶつかった後はキーを押しても歩き入力が出ない。壁に顔こすりつけて歩ける方がゲームっぽいので「入力している間ずっとダッシュ」にしたいのだがうまくいかない。
一旦今日は時間も時間なのであきらめる。

この記事が気に入ったらサポートをしてみませんか?