はじめに
フューチャーの関根正大です。
フューチャー Advent Calendar 2023の13日目になります。
今回はUnreal Engine5を使って、自分のスマホ、PCに保存した画像をキーボードやコントローラーで操作する方法を紹介しようと思います。
今回は以下の画像のように横スクロールゲーム風に操作できるように実装をしてみます。
プロジェクトの立ち上げ
それでは最初に新規プロジェクトを立ち上げます。既にプロジェクトを立ち上げていている方は飛ばして問題ありません。
今回はUnreal Engine5.3.2を起動します。
ブランクを選択し、スターターコンテンツにチェックを入れます。
プロジェクトの場所、プロジェクト名は好きな値を入れて問題ありません。
今回はC:\GameProject
にFavoriteImageProject
というプロジェクトを作成します。
新規プロジェクトが立ち上がったらファイル
から新規レベル
を選択します。
新規レベルが立ち上がったら、コンテンツ
フォルダ直下にMaps
というフォルダにTest
という名前でレベルを保存します。
好きな画像をインポートする
それではプロジェクトの作成、レベルの作成が完了したので画像のインポートをしていきます。
今回はいらすとやからカモの画像をインポートします。
画像のインポート方法は簡単で、
- コンテンツブラウザにドラッグアンドドロップ
- コンテンツブラウザのインポートから画像をインポート
をする事で取り込めます。
今回は新しくCharacter
というフォルダを作成してそこにインポートしていきます。
取り込める画像の拡張子は以下の公式ドキュメントに載っています。
jpegやpngなど代表的なものはほとんどカバーされています。
しかしこの画像のままではレベルに配置することは出来ません。
画像を操作出来るフォーマットに変換していく必要があります。
インポートした画像を右クリックし、スプライト アクション
からスプライトを作成
を選択します。
スプライトについては公式ドキュメントに説明があったため引用します。
Paper 2D の スプライト とは、完全に Unreal Engine 4 (UE4) 内で作成されるワールドでレンダリングできる Texture Mapped Planar Mesh (テクスチャ マッピングされる平面的なメッシュ) および関連マテリアルのことです。簡単に言うと、UE4 で 2D 画像を迅速かつ簡単に描画する方法です。
上記の公式ドキュメント内にも説明がありますが、スプライトはマテリアルであるため、このままではレベルに配置することはできません。
アニメーション化するためには作成したスプライトを右クリックし、フリップブックを作成
を選択します。
これでフリップブックの作成が完了します。
作成されたフリップブックはレベル上に配置することができるようになります。
作成したフリップブックをキーボードで操作する
キー入力の設定
手元の画像をレベル上に配置できるようになったため、ここからはこの画像をキーボードやコントローラーで操作する方法を紹介しようと思います。
コンテンツブラウザ上にInputs
フォルダを作成し、右クリック、入力
から`入力アクションを選択します。
今回は横スクロールゲームを想定して、ジャンプ操作と左右移動操作を実装します。
IA_Jump
とIA_Move
という入力アクションを作成します。
入力アクションについてと、この後使用する入力マッピングコンテキストに関しては以下の公式ドキュメントに記載があります。
気になる方は読んでみてください。
まずIA_Jump
から操作を加えていきます。
とは言いましたが、こちらは手を加えずにデフォルトのままで使用します。
続いてIA_Move
を修正していきます。
左右の移動のみを入力として与えたいため、Value Type
をAxis 1D(float)
に修正します。
IA_Jumpの補足
先ほどのIA_Jump
のValue Typeは
Digital(Bool)`となっていました。
これはジャンプ入力をしているか、していないか、の二値で判別をしているためになります。
次に入力マッピングコンテキストの設定をします。
Inputsフォルダ
上で右クリック、入力
から入力マッピングコンテキスト
を選択します。
今回はIMC_Mapping
という名前で保存しておこうと思います。
IMC_Mapping
を開きます。
ここでどのキーボードの入力を受け付けるかの設定をしていきます。
まずMapping
の横にある⊕ボタンを押します。
まずジャンプ操作の設定からしていきます。
なし
と書かれている部分を選択し、IA_Jump
を選択します。
次に今設定したIA_Jump
のその右にある⊕ボタンを押して、キー設定を追加します。
追加されたら、キーボードマークを選択した状態で、ジャンプキーを割り当てたいキーを押下します。
今回はスペースキーをジャンプに割り当てようと思います。
スペースキーを押すと、自動でキーの値が入力されます。
これで、スペースバーとIA_Jump
を紐づける事が出来ました。
続いてIA_Move
の設定をしていきます。
今回は右移動は「→(右矢印)」と「D」、左移動には「←(左矢印)」と「A」を割り振ります。
その際に、左移動の「←(左矢印)」と「A」のModifiers
をNegate
に設定する必要があります。
Modifiers
横の⊕ボタンを押して、Negate
の設定を追加します。
これは「←(左矢印)」と「A」を押した際に、逆の方向に進んでほしい、つまり負の方向に進むようにするためになります。
最終的にこちらの画面のように設定が出来たら、IMC_Mapping
の設定は完了となります。
もし他のキー操作を入れたい、ゲームパッドでも操作をしたい場合は同様の手順でさらにキー設定を追加することが可能です。
興味がある方はやってみてください。
BluePrintで画像を動かす
ここからは今設定をした内容を用いて、実際に画像を動かしてみようと思います。
Characterフォルダ
で右クリック、ブループリントクラス
を選択します。
親クラスを選択、という画面が出てきたら検索欄にPaper
を入力して、PaperCharacter
を選択します。
BP_Kamo
という名前を付けて保存をしておきます。
BP_Kamo
を開きます。
まず最初に、このPaperCharacterブループリント
で、どのフリップブックを使用するのか、の設定をします。
詳細パネルのSource Flipbook
で割くほど作成したFB_Kamo
を選択します。
するとビューボート上に画像が表示されます。
続いて、Game Mode Base
の設定を行います。
これを設定する事で、ゲームを開始した際にどのBluePrintを操作するようにするか、などを決められます。
コンテンツフォルダ直下で右クリック、ブループリントクラス
を選択します。
Game Mode Base
を選択します。
GMB_GameModeBase
と名前を修正します。
そしたらこちらをクリックして開きます。
今回はここで「ゲームが開始された際にどれを操作キャラクターとするのか」を設定します。
今回はゲームが開始された際にBP_Kamo
がスポーンしてほしいので、詳細パネルのクラス
から、Default Pawn Class
を選択し、その中からBP_Kamo
を選択します。
そしてこの設定が完了したら、編集
からプロジェクト設定
を開きます。
デフォルトのプロジェクト設定では、先ほど設定したGMB_GameModeBase
が設定されていません。
プロジェクト
のマップ&モード
の選択したゲームモード
をGMB_GameModeBase
に変更します。
以下の対応は行わなくても問題はありませんが、Default Maps
のエディタのスタートマップ
、ゲームのデフォルトマップ
をTest
(現在開発しているレベル)に変更しておきましょう。
これで、Unreal Engineを再起動した後、このレベルが最初に開くようになります。
いったんこの状態で再生ボタンを押しましょう。
何も表示されないと思いますが、F8
キーを押すことで、ゲームを再生している状態でカメラを自由に動かせるようになります。
するとしっかりと設定したカモの画像が表示されていることがわかります。
しかしまだBP_Kamo
に先ほど設定したIA_Jump
やIA_Move
の情報を渡していないため、操作することができません。
次はBP_Kamo
のBlue Printを作成していきます。
まずはBegin
ノードから設定していきます。
以下のようなブループリントを作成します。
一番右にあるAdd Mapping Content
のMapping Context
にはIMC_Mapping
を設定します。
これにより、ゲーム開始時に、コントローラーの情報を受け取り、どのキーで操作するのか、などの情報を付与することができます。
続いてIA_Jump
、IA_Move
を追加します。右クリックで検索をする事で出てきます。
IA_Jump
に関してあhスペースキーが押されたら、ジャンプをするようにしたいです。
しかしキーを押す、というピンはTriggered
とStarted
の2つがあります。
挙動の違いを見るために、それぞれにPrint String
を設定してみます。
実行してみるとわかりますが、
Triggered
は押している間毎フレーム実行され、
Started
はキーを押しこんだ瞬間だけ実行されます。
今回は押した瞬間にだけジャンプをするように設定するため、Started
を採用します。
対して、IA_Move
はキーが押されている間はずっと移動をしてほしいためTriggered
を採用します。
そうしましたら、以下のようにBlue Printを作成します。
IA_Jump
は、キーが押された瞬間にJump
(Unreal Engineが用意しているメソッド)を呼び出し、
キーが離されたら、Stop Jump
を呼び出します。
IA_Move
はもう少し単純で、IA_Move
が呼ばれたら、Add Movement Input
でself
(この場合BP_Kamo
)に「X座標に1.0」加える、という処理をします。
そして先ほどゲーム開始した際はFPS視点になってしまっていました。
なのでこれを横スクロール風に修正しようと思います。
BP_Kamo
のコンポーネント
にSpringArm
とCamera
を親子付けして配置します。(SpringArm
の下にCamera
が入っていれば大丈夫です。)
正面から画像が見えてほしいので、SprintArmの向きを90度回転させます。
これでゲーム開始ボタンを押すと、正面にカモが表示されます。
そしてキーボードを押下するとカモが移動しているのを確認できます。
しかし、カモはずっと右に向いているままになっています。
左に移動したら向きを左にするような処理を追加しようと思います。
BP_Kamo
の関数に⊕ボタンを押してUpdateCharacterDirection
を追加します。
以下の画像のようにノードを配置します。
Get Velocity
の部分ですが、今回はX軸方向の移動しかありません。
なのでXの速度だけを取り出そうと思います。
Get Velocity
のVelocity
ピンを右クリックし、構造体ピンを分割
を押します。
そしてVelocity X
ピンをCompare Float
のInput
ピンに接続します。
後は入ってきたVelocity X
の値が正の時、負の時で条件分岐をさせます。
IsValid
の部分はクラッシュなどの対策をするために用いられる表現になります。
(以下他の使用例になります)
そのため、ここでメインで行いたい処理はMake Rotator
とSet Control Rotation
の二つになります。
Velocity X
が正の時、つまり右方向に移動しているときはカモは右を向いていてほしいので、Make Rotator
には特に値を入れません。
先ほどのノードをコピーし、Velocity X
が負の時の処理も追加します。
この場合、カモの画像は左を向いてほしいので、Make Rotator
のZ
に180の値を入れます。
これで関数は完成になります。
今作成した関数をBP_Kamo
で呼び出さないといけないため、イベントグラフ
に戻ります。
毎フレーム処理を表すEvent Tick
と先ほどの関数Update Character Direction
を呼び出します。(画面左の関数からドラッグアンドドロップで配置できます。)
これで処理は完成です!
しかし実際に動かしてみると、カモはずっと右を向いており、
左向きに移動した際に背景も反転していることがわかります。
これはSprint Arm
が常にカモにくっついてしまっているからです。
これを修正するには、Spring Arm
の詳細パネルから、トランスフォーム
の回転
を選択し、相対
からワールド
に変更します。
これにより、カモに対する相対座標ではなく、絶対座標でSprintArm
が配置されるようになります。(カモが回転してもカメラの向きは固定になります)
実際に実行してみるとカモがしっかりと左を向くことが確認できます!!
おわりに
今回の内容は以上になります。
自分の好きな画像が、自分が作成したBlue Printで動いているのを見ると楽しいですね。
明日のアドベントカレンダー担当は@yamat2667さんからになります!
参考にした書籍やサイト