【UE5】大学生チームのローカルマルチプレイヤーゲーム開発事例

# はじめに

本記事では、私が開発リーダーを務める同志社大学のUnreal Engine専門のゲーム開発団体[**Programming.Prontier();**](https://twitter.com/pprontier)が、学園祭での展示用に制作したローカルマルチプレイヤーゲームの開発事例を紹介します。
なお開発メンバーは5人で、開発期間はゆったり4か月、実質2か月くらいです。

https://twitter.com/PProntier/status/1588093625912770560

# ゲーム概要

2～4人でプレイできる、**ローカルマルチプレイヤーの対戦ゲーム集**です。
イメージとしては「アソビ大全」や「It Takes Two」のミニゲームが近いです。
学園祭では小学生を中心に900回以上プレイしていただきました。

下記のリンクからWindows用の実行ファイルをダウンロードできます。

https://drive.google.com/file/d/1kl4Eykp3jpHxiFuciUquo4LCrxfS7uh0/view?usp=sharing

<iframe width="1280" height="720" src="https://www.youtube.com/embed/mrdMcaJ_BjY" title="Festival" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 開発環境

## エンジン

開発開始時の最新バージョンであった、**Unreal Engine 5.0.3**を使用しました。
C++の必要性は特に生じなかったため、開発はBlueprintのみで行いました。

## バージョン管理システム

**Git**と**Git LFS**を使用しました。
またクライアントにSourcetree、ホスティングにGitHubを使用しました。
Git LFSは`.uasset`および`.umap`のロック機能のみを使用しています。

## 使用プラグイン

* Unreal Engine Git Plugin：Git LFSのために使用。

https://github.com/ProjectBorealis/UEGitPlugin

* Async Loading Screen：非同期ロード画面を実装するために使用。

https://www.unrealengine.com/marketplace/ja/product/async-loading-screen

* UI Navigation：ゲームパッドにおけるUIのNavigationを楽に実装するために使用。

https://www.unrealengine.com/marketplace/ja/product/uinavigation

* WM Input Manager：DirectInputのゲームパッドに対応させるために使用。

https://www.unrealengine.com/marketplace/ja/product/wm-input-manager

# 効率的な開発を実現するために

Unreal Engine初心者のメンバーもいる中で、効率的な開発を実現するために行った工夫を3つ紹介します。

## 1. EditorUtilityBlueprintでアセットを自動で作成

ゲームの量産にあたって面倒だったのが、新しくゲームを作るたびにフォルダや必須となるアセットをいちいち作り直さないといけなかった点でした。
手動で作り直すとフォルダやアセットの名前が命名規則に沿っていないものになったり、誤字ったりする可能性もありました。

そこで、EditorUtilityBlueprintでコンテンツ作成のメニューに独自の項目を追加し、フォルダや必須となるアセットを自動で作成できるようにしました。
本開発では自分の名前のフォルダ内にゲームの名前のフォルダを作り、その中にゲームのアセットを入れるというルールにしていたため、新規ゲーム作成時に自分の名前とゲームの名前を入力させるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/ffb9ea6b-a407-0b99-baa9-633720f454d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/c05a8c9e-07a2-abf5-1b0c-5c03564904e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/a9ec45f0-a550-f896-00df-abe4d173c742.png)
アセットの作成方法は実は単純で、ダミーとして用意しているアセットを名前を変えて複製しているだけです。
この方法であれば、任意のクラスを継承したBPやDataAssetも作成することができます。
ただし、`.umap`の複製には対応していないようです（なぜ）。

EditorUtilityBlueprintについては、こちらが参考になります。

https://kinnaji.com/2021/12/17/editormenu/

## 2. DataAssetでデータドリブンにゲームを設定

プレイ可能人数や制限時間、スコア表示、チュートリアル表示など、様々なゲームに共通するようなものについては、DataAssetからデータの入力のみで設定できるようにしました。
これにより作業量やミスを減らし、Unreal Engine初心者のメンバーでも簡単にゲームを作成できるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/df84253a-ec6f-ad73-4d9e-ee34cd550bc8.png)
上記の画像の設定を反映したチュートリアルが下記の画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/c3a0b185-b34c-9dc8-82c1-32d7e840b438.png)
DataAssetについては、こちらが参考になります。

https://www.docswell.com/s/historia_Inc/5WVYJK-ue4-dataasset-subsystem-gameplayability

## 3. 初心者でも簡単にゲームを作れる土台作り

初心者でもゲームの一連の流れを簡単に実装できるよう、様々なイベントや関数等を用意しました。

* GameMode
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/744a5e4a-1453-56a8-e32b-cf2b5f0336d3.png)
* GameState
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/f699a4b3-38f7-953c-82cd-1151db29d1c1.png)
* Library
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/c4795c0b-b4ca-09fc-d066-40ca88a2172f.png)

例えば、制限時間終了時に最もスコアの高いプレイヤーを勝ち、他のプレイヤーを負けとして結果を表示し、全プレイヤーの入力を無効化するという処理は、以下の画像のノードをGameModeに追加するだけで実装することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/4053a9cd-3c7e-03be-6fe8-89d31400782b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/e8e650db-0db4-7372-4809-baf28f86ae99.png)

# プロジェクトファイル

ここまで具体的な実装方法に関してはあまり言及しませんでしたが、そこは実際に中身を見てもらう（丸投げ）ということで、プロジェクトファイルの一部を公開します。
ダウンロードする際は、`README.md`を必ずご確認ください。

https://github.com/ProgrammingProntier/FestivalCore

# おわりに

大学生のチームがUnreal Engineでゲームを開発した事例は少ないと思うので、何かの参考になれば幸いです。
Unreal Engineで開発する大学生もっと増えろ～！