今回はUnityでFPSゲームを作成してみました。完成したゲームはこちらです。https://ma510884.com/FPS_Game

参考にした記事、使用したアセットは以下になります。
- シンプルなFPS「ゾンビスレイヤー」 | Unityでゲームを作ろう!https://unity.moon-bear.com/zombie-slayer/
- 【Unity C#】制限時間になれば停止する – フタバゼミhttps://futabazemi.net/unity/timeup_stop/
- 【Unity】重複ありのBGMの鳴らし方「Play()」「PlayOneShot()」 | すくまりのメモ帳
https://squmarigames.com/2018/12/19/unity-beginner-audiosource/ - First Person All-in-One | 入出力管理 | Unity Asset Store
https://assetstore.unity.com/packages/tools/input-management/first-person-all-in-one-135316 - M4A1 PBR | 3D 銃器 | Unity Asset Store
https://assetstore.unity.com/packages/3d/props/guns/m4a1-pbr-85713 - War FX | ビジュアルエフェクト パーティクル | Unity Asset Store
https://assetstore.unity.com/packages/vfx/particles/war-fx-5669 - Zombie | 3D ヒューマノイド | Unity Asset Store
https://assetstore.unity.com/packages/3d/characters/humanoids/zombie-30232 - Cartoon Low Poly City Pack Lite | 3D アーバン | Unity Asset Store
https://assetstore.unity.com/packages/3d/environments/urban/cartoon-low-poly-city-pack-lite-166617
まずはCartoon Low Poly CityのScenesを開き、CartoonLowPolyCityLite_01を開きます。 そして、名前をGameSceneとして保存します。
次に、記事にならってFirst Person All-in-Oneをインポートし、各数値を設定します。Mouse Seisitivityは5以下が良いようです。実際に操作してみて調整してください。 Auto Crosshairはあくまで画面の中心を表示するだけですので、着弾点が表示されるわけではありません。紛らわしいので記事の通りに非表示にしてしまいましょう。
設定が済んだらUnityを実行してみましょう。何も問題がなければ道路の上を歩けると思います。

続いては銃を用意します。M4A1_PBRのモデルをFirstPerson-AIOの中のPlayer Cameraにドラッグ&ドロップし、子要素にします。その後、記事のように各数値を設定します。
こちらもUnityを実行してみてきちんと動くか確認してみましょう。

次はマズルフラッシュ(発砲時の炎)と着弾のエフェクトを追加します。GunControllerを作成して銃口の位置にセットし、記事の通りにスクリプトを作成してアタッチします。また、War FXからエフェクトのPrefabを設定します。
ここでUnityを実行すると記事のようにきちんと着弾しないと思います。実はこの記事には記述漏れがありまして、GunControllerをY方向で180度回転させる必要があります。そうすることで記事のようにきちんと着弾すると思います。Unityを実行してみて確認してください。

続いてはUIまわりを作成していきます。左下に弾薬ゲージの背景とその子要素に弾薬ゲージ、残弾数のテキスト、供給ゲージの背景とその子要素に供給ゲージを作成します。右上には得点を表示する部分を作成します。位置はGame画面を拡大表示して確認しながら微調整してください。
こちらもスクリプトを追記後GunControllerのinspectorにゲージなどを設定し、Unityを実行して動作を確認してください。

次はゲームを制御する部分を作成していきます。基本的には記事のままですが、後ほどスタートボタンを付ける関係でゲーム開始時のカメラは固定に、スコアの桁数は6桁に書き換えました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
[SerializeField]
int maxScore = 999999;
[SerializeField]
Text scoreText;
[SerializeField]
FirstPersonAIO firstPerson;
[SerializeField]
FirstPersonGunController gunCOntroller;
[SerializeField]
Text centerText;
[SerializeField]
float waitTime = 2;
[System.NonSerialized]
public bool gameOver = false;
int score = 0;
public int Score
{
set
{
score = Mathf.Clamp(value, 0, maxScore);
scoreText.text = score.ToString("D6");
}
get
{
return score;
}
}
void Start()
{
InitGame();
StartCoroutine(GameStart());
}
void InitGame()
{
Score = 0;
firstPerson.playerCanMove = false;
firstPerson.enableCameraMovement = false;
gunCOntroller.shootEnabled = false;
}
public IEnumerator GameStart()
{
yield return new WaitForSeconds(waitTime);
centerText.enabled = true;
centerText.text = "3";
yield return new WaitForSeconds(1);
centerText.text = "2";
yield return new WaitForSeconds(1);
centerText.text = "1";
yield return new WaitForSeconds(1);
centerText.text = "GO!!";
yield return new WaitForSeconds(1);
firstPerson.playerCanMove = true;
firstPerson.enableCameraMovement = true;
gunCOntroller.shootEnabled = true;
// centerText.text = "";
centerText.enabled = false;
}
public IEnumerator GameOver()
{
gameOver = true;
firstPerson.playerCanMove = false;
firstPerson.enableCameraMovement = false;
gunController.shootEnabled = false;
centerText.enabled = true;
centerText.text = "Game Over";
yield return new WaitForSeconds(1);
DestroyEnemies();
// centerText.text = "";
// centerText.enabled = false;
gameOver = false;
}
void DestroyEnemies()
{
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
foreach(GameObject enemy in enemies)
{
Destroy(enemy);
}
}
}
Unityを実行して、「3、2、1、Go!!」と表示されたあと動けるようになれば成功です。

次は敵キャラクターを作成していきます。