概要
ゲーム開始後にプレイヤーを動的にスポーンさせてみる。
作業ログ的な記事なのでプレイヤーの作成等も含めているが、主題となるプレイヤーの動的生成部分だけ見る場合はここを参照。
前回はゲーム開始後、レベル上にタイルを生成して並べるところまでを実装した。
今回の内容のプロジェクト一式
環境
UE 5.5.1
プレイヤーをポーンで作成 (BP_Player)
ブループリントクラスからポーンを選択。
名前: BP_Player
メッシュを追加
表示出来たらなんでも良いのでスタティックメッシュにした。
SM_CapsuleKun.fbx
FBX を UE のコンテンツブラウザへ D&D でインポート。
UE は X軸が前方なので、インポート時の設定でオフセットのZ軸を -90
しておく。
他はデフォルトで良さそう。(前回のタイルでは忘れてた)
色はマテリアルを開いて適当に変える。
フォルダ構成も少し整理。
スタティックメッシュコンポーネント追加
BP_Player
を開きコンポーネントウィンドウで スタティックメッシュコンポーネント
を追加。詳細ウィンドウでメッシュを SM_CapsuleKun
に設定。
スプリングアームコンポーネントを追加
カメラだけでも良い気がするけど、なんとなくスプリングアームの先にカメラを設置することにする。コンポーネントウィンドウで スプリングアーム コンポーネント
を追加。
詳細ウィンドウで回転を Y = -65、Target Arm Length を 900 にする。
スポーン時にタイルと衝突してしまうとカメラがめり込んでしまうので、一旦カメラコリジョンの Do Collision Test
は外しておく。
これ外すとますますスプリングアームの意味が無い気もするけどまぁとりあえずで。
カメラコンポーネントを追加
SpringArm の子としてカメラコンポーネントを追加する。
トランスフォームは全部初期値にする。
コンパイルしてから BP_Player
をシーン上へ適当に D&D するとこうなるはず。
※ 追加された BP_Player
は要らないのでアウトライナーから消しておくこと。
変数を追加
CurrentTile
後で必要になりそうなのでプレイヤーが現在居るタイルへの参照を保持しておく。
これはタイルへのスポーン時にセットする。(今回は使わないけど)
- CurrentTile (BP_BoardTile)
詳細ウィンドウで インスタンス編集可能
、 スポーン時に公開
のチェックを入れておく。
インスタンス編集可能
の状態は目玉アイコンと連動している。
目が開いているのがパブリック。
例:こんな感じで SpawnActor した時に同時にセットできる。
プレイヤーコントローラーを作成 (BP_PlayerController)
ブループリントクラスからプレイヤーコントローラーを選択。
名前: BP_PlayerController
今回は用意しただけで実装は無し。
ゲームモード修正 (GM_TestGame)
前回作成済の GM_TestGame
を修正し、タイルの生成後にプレイヤーをスポーンさせる。
関数を追加
SpawnPlayer
全体像。詳細はコメントの通りで。
今回の主題の箇所
BP_Player
(Pawn) を生成後、PlayerController
に Pawn を Possess
することで現在のプレイヤーを動的に差し替えることが出来る。カメラも BP_Player が持つカメラに切り替わるっぽい。
※ この後で説明するゲームモードの詳細設定変更も必要。
SpawnActor の設定について
現状は生成場所にタイルと同じ座標を指定しているので、プレイヤー生成時にタイルと衝突するとで生成失敗する。
Collision Handling Override を Always Spawn, Ignore Collisions
にしておく。
生成失敗すると画面上では何も表示されないだけだが、出力ログを見ると下記の様なエラーが表示されている。
LogSpawn: Warning: SpawnActor failed because of collision at the spawn location [X=420.000 Y=210.000 Z=0.000] for [BP_Player_C]
イベントグラフ
BeginPlay でのタイル生成後に SpawnPlayer
を呼び出す。
ワールドセッティングのゲームモード詳細変更
ゲームモードオーバーライドは前回 BP_TestGame に設定済。
- デフォルトのポーンクラス =
なし
- プレイヤーコントローラークラス =
BP_PlayerController
アウトライナーにある不要なオブジェクトを削除
PlayerStart はもう不要なので削除する。
実行
おわり