【Unity初心者向け】FPS制作の基本《 Unityで射撃&リロードシステムをゼロから作る方法 》
自己紹介
閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。
▼ はじめに ▼
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で基本的な武器のリロードと射撃システムを作成する方法を学びました。これをベースにして、さらに高度な機能や改良を加えてください。
▼ おわりに ▼
FPS開発に関してご不明な点や開発代行のご依頼がありましたら、ぜひゲーム開発所RYURYUのサービスをご利用ください。
私たちは、テキストやビデオチャットによるサポート、開発代行、そして「FPSゲーム」の受託開発も行うことが可能です。
ご興味のある方は、以下のリンクからぜひお問い合わせください。
\ 無料相談・お見積もりは公式LINEから /