【Unity初心者向け】FPS制作の基本《 Unityで射撃&リロードシステムをゼロから作る方法 》
自己紹介
閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。
Zennで5日間でFPSゲームをゼロから開発する本を執筆しました!!
▼ はじめに ▼
Unityを使用してゲームを開発する際、武器のリロードと射撃は非常に一般的な機能です。この記事では、Unityで武器のリロードと射撃処理を実装する方法を初心者向けに解説します。
0|事前準備
まず、新しいUnityプロジェクトを作成し、必要なアセット(武器、弾、サウンドクリップなど)をインポートします。次に、Hierarchyウィンドウで右クリックして新しいGameObjectを作成し、「Weapon」などの名前を付けます。
1|スクリプトの作成
Weapon GameObjectを選択し、Inspectorウィンドウで「Add Component」をクリックし、「New Script」を選んで「Weapon」スクリプトを作成します。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Weapon : MonoBehaviour
{
public int magazineCapacity = 10;
public int currentAmmoInMagazine;
public int totalAmmo;
public float reloadTime = 2f;
public float fireRate = 0.5f;
public GameObject bulletPrefab;
public Transform firePoint;
public AudioSource reloadSound;
public AudioSource fireSound;
public Text ammoText;
public int bulletsPerReload = 1;
private bool isReloading = false;
private float nextTimeToFire = 0f;
private void Start()
{
currentAmmoInMagazine = magazineCapacity;
}
private void Update()
{
ammoText.text = $"{currentAmmoInMagazine} / {totalAmmo}";
if (Input.GetKeyDown(KeyCode.R) && !isReloading)
{
StartCoroutine(Reload());
}
if (Input.GetMouseButton(0) && Time.time >= nextTimeToFire && !isReloading && currentAmmoInMagazine > 0)
{
nextTimeToFire = Time.time + 1f / fireRate;
Shoot();
}
}
private void Shoot()
{
currentAmmoInMagazine--;
// 弾のインスタンスを作成
Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
// 射撃音を再生
fireSound.Play();
}
private IEnumerator Reload()
{
isReloading = true;
int ammoNeeded = magazineCapacity - currentAmmoInMagazine;
int ammoToReload = Mathf.Min(ammoNeeded, totalAmmo, bulletsPerReload);
while (ammoToReload > 0 && totalAmmo > 0)
{
reloadSound.Play();
yield return new WaitForSeconds(reloadTime);
currentAmmoInMagazine += ammoToReload;
totalAmmo -= ammoToReload;
ammoNeeded = magazineCapacity - currentAmmoInMagazine;
ammoToReload = Mathf.Min(ammoNeeded, totalAmmo, bulletsPerReload);
}
isReloading = false;
}
}
このスクリプトでは、リロード処理と射撃処理を行います。Rキーでリロード、マウスの左ボタンで射撃を行います。リロード中は射撃ができません。
注意:このスクリプトはサンプルであり、実際のゲームプロジェクトで使用する際には、さらなる最適化やエラーハンドリングなどが必要になります。また、bulletPrefabには実際の弾の挙動(移動、衝突等)を持たせる必要があります。
2|弾のプレファブを作成
弾は非常にシンプルに実装できます。Hierarchyウィンドウで右クリックし、3D Object > Sphereを選択して、新しい球を作成します。この球が弾として機能します。
弾に少し動きを付けるために、新しいスクリプトを作成します。このスクリプトを「Bullet」と呼ぶことにしましょう。作成したら、スクリプトを開き、次のコードを追加します。
csharpCopy codeusing UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed = 20f;
public float lifeTime = 3f;
void Start()
{
Destroy(gameObject, lifeTime);
}
void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
このスクリプトは、弾が前進するようにし、一定の時間が経過したら自動的に破棄します。
Sphere(弾)を選択し、Inspectorウィンドウで先程作成した「Bullet」スクリプトをアタッチします。
最後に、このSphereをプレファブに変換します。Projectウィンドウにドラッグアンドドロップして保存します。これで、弾のプレファブができました。
▼ プレファブに変換する方法 ▼
3|Weaponスクリプトに弾のプレファブを設定
先程作成したWeaponスクリプトに戻り、InspectorウィンドウでBullet Prefabフィールドに、先程作成した弾のプレファブをドラッグアンドドロップします。
4|ゲームの挙動を確認
これで全ての設定が完了したので、ゲームをプレイして挙動を確認しましょう。
Unityエディタの上部にある再生ボタンを押してゲームを開始します。
マウスの左ボタンを押して武器を発射します。
Rキーを押して武器をリロードします。
弾が正しく発射され、リロードが機能することを確認してください。もし何か問題があれば、スクリプトやInspectorウィンドウの設定を見直しましょう。
これで、Unityで基本的な武器のリロードと射撃システムを作成する方法を学びました。これをベースにして、さらに高度な機能や改良を加えてください。
この記事を読んで「もっと実践したい!」と感じたあなたへ
Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。
1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター
5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認
たった5日でFPSゲームが作れる自分に変わる教材はこちら
2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP
初心者~中級者までOK:学習進度に合わせて質問や情報共有
質問サポートが充実:わからないことを仲間や講師に即相談
学習仲間と切磋琢磨:一緒に学ぶから続けやすい
Discordサーバー参加はこちら
3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート
コナラ総販売200件超:さまざまなUnity開発の依頼を対応
VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数