UE5 プレイヤーを動的にスポーンさせる

# 概要

ゲーム開始後に**プレイヤーを動的にスポーン**させてみる。

作業ログ的な記事なのでプレイヤーの作成等も含めているが、**主題となるプレイヤーの動的生成部分だけ見る場合は[ここ](https://qiita.com/tukanpo/items/704ea3a179054a948ca0#%E4%BB%8A%E5%9B%9E%E3%81%AE%E4%B8%BB%E9%A1%8C%E3%81%AE%E7%AE%87%E6%89%80)を参照**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/3e4de160-1047-cea3-d204-3869ecee1587.png)

前回はゲーム開始後、レベル上にタイルを生成して並べるところまでを実装した。

https://qiita.com/tukanpo/items/1f900f788f197e331a0e

今回の内容のプロジェクト一式

https://github.com/tukanpo/CM40/tree/v2

## 環境

UE 5.5.1

# プレイヤーをポーンで作成 (BP_Player)

ブループリントクラスからポーンを選択。
名前: `BP_Player`

![2025-01-17_22h25_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/9a13dc75-6b6f-746e-17e6-62b21f0891eb.png)

## メッシュを追加

表示出来たらなんでも良いのでスタティックメッシュにした。

SM_CapsuleKun.fbx

![2025-01-17_23h51_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/f1b78be6-3b31-90aa-484d-9b935c0c1987.png)

FBX を UE のコンテンツブラウザへ D&D でインポート。

![2025-01-17_23h59_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/1d0d0eea-a61c-8fbe-81f0-2877c376c254.png)

UE は X軸が前方なので、インポート時の設定でオフセットのZ軸を `-90` しておく。
他はデフォルトで良さそう。（前回のタイルでは忘れてた）

![2025-01-18_02h20_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/21e593b7-4508-ee84-4554-3ec29299cf60.png)

色はマテリアルを開いて適当に変える。
フォルダ構成も少し整理。

:::note warn
アセットの移動をした後は右クリックから `リダイレクタ参照を更新` すること。
更新をかけるのは上位階層のフォルダでも良いが、チームで開発している際に問題ないのかどうかは不明。
![2025-01-18_00h13_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/8c9fc56c-fa84-bd92-12cd-ccd6767a8d70.png)
:::

## スタティックメッシュコンポーネント追加

`BP_Player` を開きコンポーネントウィンドウで `スタティックメッシュコンポーネント` を追加。詳細ウィンドウでメッシュを `SM_CapsuleKun` に設定。

![2025-01-18_01h05_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/87d4cc0b-de01-3923-7d45-e6a0cf3ee6eb.png)

## スプリングアームコンポーネントを追加

カメラだけでも良い気がするけど、なんとなくスプリングアームの先にカメラを設置することにする。コンポーネントウィンドウで `スプリングアーム コンポーネント` を追加。

![2025-01-18_02h04_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/69cb32c5-20ed-a1dd-7cc5-3846a86f8286.png)

詳細ウィンドウで回転を Y = -65、Target Arm Length を 900 にする。

![2025-01-18_02h26_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/f7ea4545-d0b5-1f9c-c7f7-291083952488.png)

スポーン時にタイルと衝突してしまうとカメラがめり込んでしまうので、一旦カメラコリジョンの `Do Collision Test` は外しておく。

これ外すとますますスプリングアームの意味が無い気もするけどまぁとりあえずで。

![2025-01-18_13h32_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/d1ebf043-df22-1e3e-5718-524839efa394.png)

## カメラコンポーネントを追加

SpringArm の子としてカメラコンポーネントを追加する。

![2025-01-18_02h31_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/75fce396-2ded-f900-a604-46ec763713c5.png)

トランスフォームは全部初期値にする。

![2025-01-18_02h32_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/d85c0f27-e5cf-f010-a51a-bac3f56b3608.png)

コンパイルしてから `BP_Player` をシーン上へ適当に D&D するとこうなるはず。
※ 追加された `BP_Player` は要らないのでアウトライナーから消しておくこと。

![2025-01-18_02h49_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/bc142a4a-f2d7-3f60-c039-e3d2b7567eee.png)

## 変数を追加

### CurrentTile

後で必要になりそうなのでプレイヤーが現在居るタイルへの参照を保持しておく。
これはタイルへのスポーン時にセットする。（今回は使わないけど）

- CurrentTile (BP_BoardTile)

詳細ウィンドウで `インスタンス編集可能`、 `スポーン時に公開`のチェックを入れておく。

![2025-01-18_12h18_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/104e9b76-8552-471d-a507-0e7027d4be4a.png)

`インスタンス編集可能` の状態は目玉アイコンと連動している。
目が開いているのがパブリック。

![2025-01-18_12h11_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/538280e3-8512-a09a-9686-0d7530aacb73.png)

例：こんな感じで SpawnActor した時に同時にセットできる。
![2025-01-18_12h32_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/0c1a62bc-4eeb-f962-1eac-9c385798ddd2.png)

# プレイヤーコントローラーを作成 (BP_PlayerController)

ブループリントクラスからプレイヤーコントローラーを選択。
名前: `BP_PlayerController`

![2025-01-17_22h27_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/7daa3361-f00b-791e-1f55-0c17bda9b598.png)

今回は用意しただけで実装は無し。

# ゲームモード修正 (GM_TestGame)

前回作成済の `GM_TestGame` を修正し、タイルの生成後にプレイヤーをスポーンさせる。

## 関数を追加

### SpawnPlayer

全体像。詳細はコメントの通りで。

![2025-01-19_00h16_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/850e5a2f-e01c-4761-4739-db564a27718b.png)

#### 今回の主題の箇所

`BP_Player` (Pawn) を生成後、`PlayerController` に Pawn を `Possess` することで現在のプレイヤーを動的に差し替えることが出来る。カメラも BP_Player が持つカメラに切り替わるっぽい。

※ この後で説明するゲームモードの詳細設定変更も必要。

![2025-01-19_01h49_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/baa8db5f-c81f-3877-c730-d67435ad3938.png)

#### SpawnActor の設定について

現状は生成場所にタイルと同じ座標を指定しているので、プレイヤー生成時にタイルと衝突するとで生成失敗する。
Collision Handling Override を `Always Spawn, Ignore Collisions` にしておく。

![2025-01-19_00h17_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/f4dfff2f-0adf-dbba-7805-f5ae7ef72b70.png)

生成失敗すると画面上では何も表示されないだけだが、出力ログを見ると下記の様なエラーが表示されている。
```
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` を呼び出す。

![2025-01-18_23h58_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/bf18e84f-63f6-0820-0e5d-0eb7ed899fb1.png)

# ワールドセッティングのゲームモード詳細変更

ゲームモードオーバーライドは前回 BP_TestGame に設定済。

- デフォルトのポーンクラス = `なし`
- プレイヤーコントローラークラス = `BP_PlayerController`

![2025-01-18_12h44_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/2659ea73-32d6-777a-6637-bb507fa498b8.png)

# アウトライナーにある不要なオブジェクトを削除

PlayerStart はもう不要なので削除する。

![2025-01-18_12h43_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/bb7d77d4-4341-8ac5-76b6-e6ceae967579.png)

# 実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18334/8c04c885-dde0-736d-aedc-7733d03c67dd.png)

おわり