見出し画像

【Unity初心者向け】FPS制作の基本《 Unityで射撃&リロードシステムをゼロから作る方法 》

自己紹介

閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。

❏ ゲーム開発ランキング【 1位 】実績多数
❏ ココナラ総販売【 180件達成 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり

【ゲーム開発所RYURYUとは】
Unityを駆使した先進的な「ゲーム・VR・メタバース開発」や「オンライン教育サービス」を展開するゲームスタジオです。


▼ はじめに ▼

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キーでリロード、マウスの左ボタンで射撃を行います。リロード中は射撃ができません。

《 インスペクターで設定する値 》
magazineCapacity
 : マガジンの容量
currentAmmoInMagazine : 現在のマガジン内の弾数
totalAmmo : プレイヤーが持っている全弾数
reloadTime : リロードにかかる時間
fireRate : 射撃のレート(秒間の発射数)
bulletPrefab : 発射される弾のプレファブ
firePoint : 弾が発射される位置
reloadSoundおよびfireSound : リロードおよび射撃時の音源
ammoText : 残弾数を表示するテキストUI
bulletsPerReload : 一度のリロードで補充される弾数です。この値を1に設定すると、例えばスナイパーライフルのように一度に1発ずつ装填します。

注意:このスクリプトはサンプルであり、実際のゲームプロジェクトで使用する際には、さらなる最適化やエラーハンドリングなどが必要になります。また、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|ゲームの挙動を確認

これで全ての設定が完了したので、ゲームをプレイして挙動を確認しましょう。

  1. Unityエディタの上部にある再生ボタンを押してゲームを開始します。

  2. マウスの左ボタンを押して武器を発射します。

  3. Rキーを押して武器をリロードします。

弾が正しく発射され、リロードが機能することを確認してください。もし何か問題があれば、スクリプトやInspectorウィンドウの設定を見直しましょう。
これで、Unityで基本的な武器のリロードと射撃システムを作成する方法を学びました。これをベースにして、さらに高度な機能や改良を加えてください。


▼ おわりに ▼

FPS開発に関してご不明な点や開発代行のご依頼がありましたら、ぜひゲーム開発所RYURYUのサービスをご利用ください。

私たちは、テキストやビデオチャットによるサポート、開発代行、そして「FPSゲーム」の受託開発も行うことが可能です。

ご興味のある方は、以下のリンクからぜひお問い合わせください。


\ 無料相談・お見積もりは公式LINEから /


TOP記事

いいなと思ったら応援しよう!

ゲーム開発所RYURYU
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!by ゲーム開発所RYURYU