見出し画像

Unity初心者必見! - FPS制作の基本!Unityで射撃&リロードシステムをゼロから作る方法 -

更新日 2024 / 03 / 17

自己紹介

\ ココナラ実績140件達成 /
こんにちは!ゲーム開発所RYURYUのりゅうやと申します。

お知らせ
📢 公式LINEを通じて、無料で相談や見積もりを提供しています!
Unity関連のお仕事の依頼や、エラー解決などのお悩み事に、経験豊富なプロフェッショナルが対応します。


📢 Unityに興味がある方にお得なお知らせ

ゲーム開発所RYURYUの公式LINEを友だち追加して、5つの特別な特典🎁を受け取ろう‼️


はじめに

Unityを使用してゲームを開発する際、武器のリロードと射撃は非常に一般的な機能です。この記事では、Unityで武器のリロードと射撃処理を実装する方法を初心者向けに解説します。


準備

まず、新しい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で基本的な武器のリロードと射撃システムを作成する方法を学びました。これをベースにして、さらに高度な機能や改良を加えてください。


まとめ

Unityでリアルな射撃とリロードのシステムを実装することは、ゲーム開発において非常に重要なスキルです。今回紹介した手法を用いて、あなたのゲームに爽快感と深みをもたらしましょう。


TOP記事

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