1. はじめに
2Dタワーディフェンスゲームを作るにあたって、前回の記事では 「敵の配置・アニメーション・HPバーの実装」 までを行いました。今回の記事では、「武器の設置・敵の攻撃範囲設定・弾の発射とリロード」 について詳しく解説していきます。
タワーディフェンスゲームでは、敵の侵入を防ぐために「武器」が自動で攻撃を行う仕組み が重要です。この記事では、以下の内容を学ぶことができます。
この記事で学べること
✅ 武器(砲台)の配置と攻撃範囲の設定
✅ 敵に向かって発射される弾の作成
✅ 弾が敵を追尾し、ダメージを与える仕組み
✅ 武器のリロードと発射間隔の調整
この内容をマスターすれば、タワーディフェンスゲームの基本的な攻撃システム を実装することができます!
2Dタワーディフェンスゲームを一から作るのは楽しいですが、効率的に開発したいならアセットを活用するのもおすすめ です。例えば、Tower Defense Toolkit 4 (TDTK-4)というアセットを使えば、タワーディフェンスに必要な機能が揃っており、すぐにゲーム開発を始められます。
必要な準備(前回の記事の復習)
前回の記事では、以下のことを実装しました。
- 敵の配置
Empty
オブジェクトを作成し、SpriteRenderer
で敵の画像を設定BoxCollider2D
で当たり判定を追加Rigidbody2D
のBodyType
をKinematic
に設定
- 敵のアニメーション
EnemyWalk
アニメーションの作成(歩行モーション)EnemyHit
アニメーションの作成(攻撃を受けた際のモーション)Animator
を使ったアニメーションの遷移設定
- HPバーの実装
Canvas
をWorld Space
に設定- 赤(背景)と緑(HPバー)の
Image
を配置 EnemyHP
スクリプトでHPの管理とダメージ処理を実装
また、クリックで敵にダメージを与える処理 も追加しました。
今回の記事では、この仕組みをさらに発展させ、プレイヤーが操作しなくても「武器」が自動で敵を攻撃するようにします」。
それでは、さっそく武器の設置から始めていきましょう!
2. 武器の配置
タワーディフェンスゲームでは、敵を迎撃するために「武器(砲台)」を配置する必要があります。ここでは、武器のオブジェクトを作成し、攻撃範囲の設定や弾を発射する準備 を行っていきます。
① FireWeaponオブジェクトの作成
まずは、武器の親オブジェクトとなる FireWeapon
を作成します。
- ヒエラルキー(Hierarchy)ウィンドウで右クリック
- 「Create Empty」を選択
- 名前を「FireWeapon」に変更
このオブジェクトが武器全体の基盤となります。
② 攻撃範囲を指定するための CircleCollider2D の追加
武器が敵を検知できるようにするため、攻撃範囲 を表す CircleCollider2D
を追加します。
FireWeapon
を選択- インスペクター(Inspector)ウィンドウで「Add Component」をクリック
- 「CircleCollider2D」を追加
- 「Is Trigger」にチェックを入れる(敵を検知するため)

これで、武器が敵の接近を感知できるようになります。
③ FireWeaponの子オブジェクトとして platform と rotatePoint を作成
次に、武器を構成する2つのオブジェクトを作成します。
FireWeapon
を選択した状態で、右クリック → 「Create Empty」 を選択- 名前を「
platform
」に変更 - もう一度、右クリック → 「Create Empty」 を選択し、名前を「
rotatePoint
」に変更

この2つのオブジェクトは、以下の役割を持ちます。
platform
→ 武器の土台(砲台のベース)rotatePoint
→ 武器の回転ポイント(銃身や砲身を回転させる)
作成したら、それぞれの Transform
をリセットしておきましょう。
platform
を選択- インスペクターの「Transform」の「Reset」ボタンをクリック
rotatePoint
も同様にリセット
④ platform に SpriteRenderer を追加し、画像を設定
砲台のベースとなる platform
に画像を設定します。
platform
を選択- 「Add Component」→ 「SpriteRenderer」 を追加
- 用意した画像を「Sprite」に設定

砲台のベースとなる見た目が追加されました。

⑤ rotatePoint の子オブジェクトとして WeaponImage と BulletPos を作成
武器の銃身(砲身)と弾の発射位置を作成します。
rotatePoint
を選択した状態で、右クリック → 「Create Empty」- 名前を「WeaponImage」に変更
- もう一度、右クリック → 「Create Empty」 を作成し、名前を「BulletPos」に変更

次に、WeaponImage
に見た目となる画像を設定します。
WeaponImage
を選択- 「Add Component」→ 「SpriteRenderer」 を追加
- 用意した武器の画像を「Sprite」に設定

⑥ SortingLayerの設定
ゲームオブジェクトの表示順を正しくするために、Sorting Layer を設定します。
- 「Window」メニューから「Rendering」→「Sorting Layers」を開く
- 「+」ボタンをクリックして以下のレイヤーを作成
- Node(ノード用)
- Enemy(敵用)
- Weapon(武器用)
- Bullet(弾用)
- UI(ユーザーインターフェース用)

Sorting Layer は、数値が大きいほど前面に表示される 仕組みです。
platform
とWeaponImage
の Sorting Layer を「Weapon」に設定WeaponImage
の Order in Layer を1
に設定(platform
より前面に表示)

⑦ BulletPos の位置調整
弾の発射位置である BulletPos
の位置を調整します。
BulletPos
を選択- インスペクター(Inspector)の左上にあるボタンをクリック(位置表示アイコン)
- ゲームビューでわかりやすい位置に調整(武器の銃口や砲身の先端に設定)

これで、弾が発射される位置を指定できました。

ここまでで、武器の基本的な配置と攻撃範囲の設定が完了 しました!
次のステップでは、武器が敵を検知し、弾を発射するスクリプトを作成 していきます!
3. 武器のスクリプトの作成
武器を配置したら、次は 「敵が攻撃範囲に入ったかどうかを判定するスクリプト」 を作成します。
このスクリプトを使って、敵が一定距離内に近づいたときに検知する処理 を実装していきます。
① Weapon スクリプトの作成
まずは Weapon
スクリプトを作成します。
- 「Project」ウィンドウで「Scripts」フォルダを開く
- 「Scripts」フォルダ内に「Weapon」フォルダを作成
- Weaponフォルダ内で右クリック → 「Create」→「C# Script」 を選択
- スクリプトの名前を「Weapon」に変更
作成したら、ダブルクリックしてスクリプトを開き、以下のコードを入力します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Weapon : MonoBehaviour
{
//武器の攻撃範囲
public float attackRange = 3f;
void Start()
{
//プレイ開始時に数値を合わせる
GetComponent<CircleCollider2D>().radius= attackRange;
}
void Update()
{
}
private void OnDrawGizmos()
{
//ゲームプレイ中以外も攻撃範囲を表示させる
Gizmos.DrawWireSphere(transform.position, attackRange);
}
private void OnTriggerEnter2D(Collider2D collision)
{
//攻撃範囲に敵が入った時の処理
if (collision.CompareTag("Enemy"))
{
Debug.Log("攻撃範囲に入りました");
}
}
private void OnTriggerExit2D(Collider2D collision)
{
//攻撃範囲から敵が出たときの処理
if (collision.CompareTag("Enemy"))
{
Debug.Log("攻撃範囲から出ました");
}
}
}
② スクリプトの解説
このスクリプトでは、以下の機能を実装しています。
✅ 攻撃範囲の設定
attackRange
という変数を作成し、攻撃範囲の半径を指定CircleCollider2D
のradius
をattackRange
に設定
✅ 攻撃範囲の可視化
OnDrawGizmos()
を使って、シーンビュー上で攻撃範囲を赤い円で表示
✅ 敵を検知する処理
OnTriggerEnter2D()
→ 敵 (Enemy
タグがついたオブジェクト) が攻撃範囲に入るとログを表示OnTriggerExit2D()
→ 敵が攻撃範囲から出るとログを表示
③ Weapon スクリプトを FireWeapon にアタッチ
作成したスクリプトを、武器オブジェクトに適用します。
- ヒエラルキーで
FireWeapon
を選択 - ドラッグアンドドロップし、スクリプトを追加

これで、FireWeapon
にスクリプトが適用されました!
④ Unityエディタで動作確認
動作確認のため、Enemy
オブジェクトを攻撃範囲に入れてログをチェック しましょう。
- ヒエラルキーで
Enemy
を選択し、「Inspector」でTag
を「Enemy」に設定」 FireWeapon
のCircleCollider2D
のIsTrigger
にチェックが入っているか確認- Unityを再生(▶ボタンをクリック)
Enemy
をFireWeapon
の攻撃範囲内に手動で移動- 「Console」ウィンドウで
Debug.Log()
のメッセージが表示されるか確認

✅ 敵が攻撃範囲に入ると「敵が攻撃範囲に入りました」とログが表示される
✅ 敵が攻撃範囲から出ると「敵が攻撃範囲から出ました」とログが表示される

これで 「武器が攻撃範囲内の敵を検知する」 仕組みが完成しました!
次のステップでは、実際に弾を発射する処理 を作成していきます!
4. 弾の作成
武器が攻撃範囲内の敵を検知できるようになったので、次は 「弾(Bullet)」 を作成します。
ここでは、弾のオブジェクトを作成し、見た目を設定してPrefab化 します。
① Bulletオブジェクトの作成
まずは、弾のベースとなるオブジェクト を作成します。
- ヒエラルキー(Hierarchy)ウィンドウで右クリック
- 「Create Empty」を選択
- 名前を「Bullet」に変更
Bullet
を選択し、インスペクター(Inspector)で「Reset Transform」ボタンを押す- Position (0,0,0)
- Rotation (0,0,0)
- Scale (1,1,1)
これで、弾の基盤となるオブジェクトが作成されました。
② SpriteRenderer の追加
弾の見た目を設定するため、SpriteRenderer
を追加します。
Bullet
を選択した状態で、「Inspector」の「Add Component」をクリック- 「SpriteRenderer」を追加
- 用意した弾の画像を
Sprite
に設定
③ SortingLayer を Bullet に変更
弾が適切な表示順で描画されるように SortingLayer を設定します。
- 「Window」→「Rendering」→「Sorting Layers」を開く
- 「+」ボタンをクリックし、新しいレイヤー「Bullet」を作成
Bullet
のSpriteRenderer
の「Sorting Layer」を「Bullet」に設定
これで、弾が敵や武器と適切な順番で表示されるようになります。
④ Bulletスクリプトの作成
弾の動きを制御するために、新しくスクリプトを作成します。
- 「Project」ウィンドウで「Scripts」フォルダを開く
- 「Weapon」フォルダ内で右クリック → 「Create」→「C# Script」
- スクリプトの名前を「Bullet」に変更
⑤ Bulletスクリプトを Bullet にアタッチ
作成したスクリプトを、弾のオブジェクトに適用します。
- ヒエラルキーで
Bullet
を選択 - 「Inspector」ウィンドウの「Add Component」をクリック
- 検索バーに「Bullet」と入力し、スクリプトを追加

これで、Bullet
にスクリプトが適用されました。
⑥ BulletのPrefab化
弾のオブジェクトをPrefab化して、ゲーム中に複数発射できるように します。
- 「Project」ウィンドウで「Prefabs」フォルダを作成(まだない場合)
Bullet
を「Prefabs」フォルダにドラッグ&ドロップ- ヒエラルキーから
Bullet
を削除(Prefab化されたので不要)

これで、弾が Prefab化 され、ゲーム中に複数生成できるようになりました!

これで、「弾の作成とPrefab化」 が完了しました!
次のステップでは、弾のスクリプトを実装 していきます!
5. 弾のスクリプトの作成
前のステップで 弾(Bullet) を作成しました。
今回は 弾が敵に向かって飛んでいき、一定の距離まで近づいたらダメージを与えるスクリプト を作成していきます。
① Enemy スクリプトの修正
弾が敵にダメージを与えられるように、Enemy
スクリプトに HP管理用のコード を追加します。
- 「Project」ウィンドウで
Scripts/Enemy
フォルダを開く Enemy
スクリプトを開き、以下のコードを入力または修正
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public EnemyHP enemyHP;
void Start()
{
// 自分のHP管理スクリプトを取得
enemyHP = GetComponent<EnemyHP>();
}
void Update()
{
}
}
✅ このコードのポイント
EnemyHP
スクリプト(敵のHP管理用)をEnemy
クラス内で取得enemyHP
変数を通じて、敵のHPを操作できるようにする
これで、弾が敵にダメージを与える準備が整いました!
② Bullet スクリプトの作成
次に、弾が敵に向かって飛んでいき、一定距離まで近づいたらダメージを与える処理を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く Bullet
スクリプトを開き、以下のコードを入力または修正
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
// 弾の移動速度
[SerializeField] private float moveSpeed = 10f;
// ダメージ発生距離
[SerializeField] private float damageDistance = 0.1f;
// ターゲットとなる敵
private Enemy enemyTarget;
// ダメージ量
private float damage;
private void Start()
{
// 動作確認用のコード(不要になったら削除)
enemyTarget = FindObjectOfType<Enemy>();
}
void Update()
{
if (enemyTarget != null)
{
// 弾を移動させる
MoveBullet();
}
}
private void MoveBullet()
{
// 現在地から敵の位置まで一定速度で移動
transform.position = Vector2.MoveTowards(
transform.position, enemyTarget.transform.position, moveSpeed * Time.deltaTime);
// 敵との距離を確認し、ダメージを与えるかチェック
CheckDistance();
}
/// <summary>
/// 弾と敵の距離を確認し、近ければダメージを与える
/// </summary>
private void CheckDistance()
{
// 敵との距離を計算
float distanceToTarget = (enemyTarget.transform.position - transform.position).magnitude;
// もし敵に近づいたら
if (distanceToTarget < damageDistance)
{
// ダメージを与える
enemyTarget.enemyHP.ReduceHP(damage);
}
}
}
✅ このコードのポイント
enemyTarget
→ ターゲットの敵damageDistance
→ 弾が敵に当たったと判定する距離MoveBullet()
→ 弾を敵の方向へ移動させる処理CheckDistance()
→ 敵に一定距離まで近づいたらダメージを与える
③ Unityエディタで動作確認
スクリプトの動作を確認して、弾が敵に向かって飛んでいくか をチェックします。
動作確認手順
- Unityを再生(▶ボタンをクリック)
- シーンビューまたはゲームビューで
Enemy
の位置を確認 - 敵に向かって弾が飛んでいくか確認
- 弾が敵に当たると
Console
ウィンドウにログが出るか確認Debug.Log("ダメージを与えた");
などのログを追加してチェック
✅ 弾が敵に向かって飛んでいく
✅ 敵に当たると Debug.Log()
でログが出る
④ 動作確認用コードを削除
弾が正しく敵に飛んでいくことを確認したら、Start() 内の動作確認用コードを削除 します。
修正前
private void Start()
{
// 動作確認用のコード 不要になったら消去
enemyTarget = FindObjectOfType<Enemy>();
}
修正後
private void Start()
{
// ここにはターゲット設定の処理を後で追加
}

これで、弾が敵に向かって移動し、一定の距離でダメージを与える処理 が実装できました!
次のステップでは、武器が弾を発射するスクリプト(WeaponControl)を作成 していきます!
6. 武器のリロード実装
武器が弾を発射するためには、弾を装填(リロード)する仕組み が必要です。
このステップでは、武器が弾を発射し、発射後にリロードして新しい弾を装填するスクリプト を作成します。
① WeaponControl スクリプトの作成
まず、武器のリロードを管理する WeaponControl
スクリプトを作成します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く - 「右クリック」→「Create」→「C# Script」 を選択
- スクリプトの名前を
WeaponControl
に変更 - 作成したスクリプトをダブルクリックして開く
以下のコードを入力してください。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponControl : MonoBehaviour
{
//弾を生成する位置
[SerializeField] private Transform bulletSpawnPos;
//攻撃準備中の攻撃用の弾
private Bullet currentBullet;
//武器を格納
private Weapon weapon;
//設定用の弾ダメージ
[SerializeField] private float damage = 2f;
//アップグレードするときにこの変数を変更する
[NonSerialized] public float bulletDamage;
//生成する弾を格納する
public GameObject fireBullet;
private void Start()
{
//Weapon変数に格納
weapon= GetComponent<Weapon>();
//設定用の変数の数値を格納する
bulletDamage = damage;
//弾をセットする
ReloadBullet();
}
private void Update()
{
if (!currentBullet)
{
ReloadBullet();
}
}
private void ReloadBullet()
{
//弾を生成してポジションと親を設定
GameObject newBullet = Instantiate(fireBullet);
newBullet.transform.localPosition = bulletSpawnPos.position;
newBullet.transform.SetParent(bulletSpawnPos);
//コンポーネントを格納してダメージなどの初期設定をする
currentBullet= newBullet.GetComponent<Bullet>();
}
}
② WeaponControl スクリプトの解説
このスクリプトでは、以下の動作を実装しています。
✅ WeaponControl
を FireWeapon
にアタッチし、弾をリロードする処理を管理
✅ bulletSpawnPos
(弾の発射位置)を指定し、そこに弾を生成
✅ 弾が存在しない場合は ReloadBullet()
を実行し、新しい弾を装填
✅ fireBullet
に設定した Bullet
のPrefabを元に新しい弾を作成
③ WeaponControl を FireWeapon にアタッチ
作成したスクリプトを、武器オブジェクトに適用します。
- ヒエラルキーで
FireWeapon
を選択 - 「Inspector」ウィンドウの「Add Component」をクリック
- 検索バーに「WeaponControl」と入力し、スクリプトを追加
④ BulletSpawnPos に BulletPos を設定
弾の発射位置を設定するために、BulletSpawnPos
に BulletPos
をアタッチ します。
- ヒエラルキーで
FireWeapon
を選択 - 「Inspector」ウィンドウで
WeaponControl
のbulletSpawnPos
の欄を探す - 「ヒエラルキー内の
BulletPos
をドラッグ&ドロップ」してbulletSpawnPos
に設定
⑤ fireBullet に弾のPrefabを設定
弾の発射には Bullet
のPrefabが必要なので、fireBullet
にPrefabを設定 します。
- 「Project」ウィンドウで
Prefabs
フォルダを開く - 作成済みの
Bullet
プレハブを探す WeaponControl
のfireBullet
の欄にBullet
プレハブをドラッグ&ドロップ

⑥ Unityエディタで弾の発射を確認
すべての設定が完了したら、実際に Unityエディタで弾の発射を確認 してみましょう。
動作確認手順
- Unityを再生(▶ボタンをクリック)
- シーンビューまたはゲームビューで
FireWeapon
のBulletSpawnPos
を確認 - 弾が適切に生成されているかチェック
Console
ウィンドウを開き、Debug.Log()
でリロードが動作しているか確認
✅ 弾が正しく生成され、BulletSpawnPos
の位置に装填される
✅ 発射後に新しい弾が装填される

これで、「弾をリロードし、新しい弾を装填する仕組み」 が完成しました!
次のステップでは、実際に武器が敵を狙って弾を発射する処理 を作成していきます!
7. 弾を敵に追尾させる
これまでのステップで 弾を発射し、敵に当たるとダメージを与える 仕組みを作成しました。
しかし、現在の弾は適当な敵をターゲットにして飛んでいく だけで、最も近い敵を優先して狙う処理 がありません。
このステップでは、敵をリスト管理し、最も近い敵をターゲットにして弾を追尾 する機能を実装します。
① Weapon スクリプトの修正
まず、攻撃範囲内の敵を管理し、最も近い敵をターゲットにする処理 を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く Weapon
スクリプトを開き、以下のコードを追加
//エネミーを格納するリスト
private List<Enemy> enemies;
//攻撃範囲内にいるターゲットを一体格納する
[NonSerialized] public Enemy currentEnemyTarget;
void Start()
{
enemies= new List<Enemy>();
}
void Update()
{
//ターゲットを取得する
GetCurrentTarget();
}
private void GetCurrentTarget()
{
//リストに敵がいないかどうか
if (enemies.Count <= 0)
{
//設定をnullに
currentEnemyTarget=null;
return;
}
//リストから設定
currentEnemyTarget = enemies[0];
}
private void OnTriggerEnter2D(Collider2D collision)
{
//攻撃範囲に敵が入った時の処理
if (collision.CompareTag("Enemy"))
{
//リストに格納する
Enemy enemy = collision.GetComponent<Enemy>();
enemies.Add(enemy);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
//攻撃範囲から敵が出たときの処理
if (collision.CompareTag("Enemy"))
{
Enemy enemy = collision.GetComponent<Enemy>();
//リストの中に引数の要素があるか判定
if (enemies.Contains(enemy))
{
//いるならリストから消去
enemies.Remove(enemy);
}
}
}
✅ このコードのポイント
List<Enemy>
を使い、攻撃範囲にいる敵をリスト管理GetCurrentTarget()
で、リストの先頭の敵をターゲットにするOnTriggerEnter2D()
で範囲に入った敵をリストに追加OnTriggerExit2D()
で範囲外に出た敵をリストから削除
これで、攻撃範囲内の敵をターゲットにする準備 ができました!
② Bullet スクリプトの修正
次に、ターゲットの敵を指定できるようにする関数 SetTargetEnemy()
を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く Bullet
スクリプトを開き、以下の関数を追加
/// <summary>
/// 攻撃対象を設定する
/// </summary>
/// <param name="enemy"></param>
public void SetTargetEnemy(Enemy enemy)
{
enemyTarget = enemy;
}
✅ このコードのポイント
SetTargetEnemy(Enemy enemy)
を呼び出すことで、弾のターゲットを動的に変更可能- 武器が攻撃する敵を決定した後、弾がその敵を追尾する
③ WeaponControl スクリプトの修正
次に、WeaponControl
の Update()
内で ターゲットを取得して弾に設定 する処理を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く WeaponControl
スクリプトを開き、Update()
内のif
文にelse
を追加
else
{
currentBullet.SetTargetEnemy(weapon.currentEnemyTarget);
}
✅ このコードのポイント
- 弾がない場合はリロード
- 弾がある場合は、ターゲットの敵を設定
④ Unityエディタで弾が敵を追尾するか確認
スクリプトを修正したら、Unityエディタで動作を確認 しましょう。
動作確認手順
- Unityを再生(▶ボタンをクリック)
- 敵 (
Enemy
) をFireWeapon
の攻撃範囲に移動 - 弾が自動的に
Enemy
に向かって飛んでいくか確認 Console
ウィンドウを開き、Debug.Log()
のメッセージが正しく出力されるか確認

✅ 弾が FireWeapon
の攻撃範囲内の敵をターゲットにして発射される
✅ Console
に Debug.Log()
が正しく表示される

これで、「弾が最も近い敵をターゲットにして追尾する仕組み」 が完成しました!
次のステップでは、敵に当たったら弾を消滅させる処理 を追加していきます!
8. 弾が敵に当たったときの処理
これまでのステップで、弾が敵を追尾する仕組み を実装しました。
しかし、現時点では 弾が敵に当たった後も残り続けてしまう ため、適切に 弾を消去し、ダメージを与える処理 を追加します。
① Bullet スクリプトの修正
まず、弾が敵に当たったらダメージを与えて消える処理 を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く Bullet
スクリプトを開き、以下のコードを追加
//WeaponControlを管理するコンポーネント
private WeaponControl bulletControl;
//CheckDistanceのif文に追加する
//弾の設定を初期化
bulletControl.ResetBullet();
//当たった弾は消去
Destroy(gameObject);
public void BulletInitialization(WeaponControl weaponControl, float damage)
{
//引数を変数に格納する
bulletControl = weaponControl;
this.damage = damage;
}
}
✅ このコードのポイント
CheckDistance()
内で、弾と敵の距離を確認し、ダメージを与えるbulletControl.ResetBullet()
を呼び出して、弾の情報をリセットDestroy(gameObject);
で弾を削除し、視覚的にも消えるようにするBulletInitialization()
を作成し、弾が発射されたときに WeaponControl の情報を受け取る
② WeaponControl スクリプトの修正
次に、WeaponControl
に弾のリセット処理 を追加します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く WeaponControl
スクリプトを開き、以下のコードを追加・修正
//updateのelseの中に書く
//親の設定を消す
currentBullet.transform.parent = null;
//ReloadBulletの中に書く
//初期設定
currentBullet.BulletInitialization(this, bulletDamage);
/// <summary>
/// 装填中の弾の設定を消す
/// </summary>
/// <exception cref="NotImplementedException"></exception>
internal void ResetBullet()
{
currentBullet = null;
}
✅ このコードのポイント
Update()
内でcurrentBullet.transform.parent = null;
を追加し、弾の親オブジェクトを解除ReloadBullet()
の中でBulletInitialization()
を呼び出し、弾の情報をセットResetBullet()
を作成し、弾が消えたときにリロードを促す
③ Unityエディタで動作確認
動作確認手順
- Unityを再生(▶ボタンをクリック)
- 敵 (
Enemy
) をFireWeapon
の攻撃範囲に移動 - 弾が
Enemy
に向かって飛んでいくことを確認 - 敵に当たった弾が消えることを確認
- 敵のHPが減少することを確認
Console
ウィンドウでDebug.Log()
を有効にして、処理が適切に動いているかチェック
✅ 弾が敵をターゲットにして飛んでいく
✅ 敵に当たると Destroy(gameObject);
により弾が消える
✅ ReduceHP(damage);
により敵のHPが減る

これで、「弾が敵に当たると消え、適切にダメージを与える処理」 が完成しました!
次のステップでは、弾の発射間隔を調整し、バランスの取れた戦闘システムを実装 していきます!
9. 弾の発射間隔を調整
これまでの実装で、武器が敵をターゲットにして弾を発射し、ダメージを与える仕組み は完成しました。
しかし、現在は 弾が無限に発射され続ける状態 になっているため、適切な 発射間隔(クールタイム) を設定して、一定時間ごとに弾を発射する 仕組みを作ります。
① WeaponControl スクリプトの修正
まず、発射間隔を制御する変数とロジックを追加 します。
- 「Project」ウィンドウで
Scripts/Weapon
フォルダを開く WeaponControl
スクリプトを開き、以下のコードを修正・追加
//発射する間隔
[SerializeField] private float firingInterval = 2f;
private float nextFireTime;
[NonSerialized] public float delay;
//スタート関数bulletDamageの下に書き足す
delay= firingInterval;
//update関数のelseを消去して書き足す
if (Time.time > nextFireTime)
{
if (Shootable())
{
//親の設定を消す
currentBullet.transform.parent = null;
//弾の攻撃対象を設定
currentBullet.SetTargetEnemy(weapon.currentEnemyTarget);
}
//次の攻撃までの時間を設定
nextFireTime = Time.time + delay;
}
private bool Shootable()
{
return weapon.currentEnemyTarget != null && currentBullet != null
&& weapon.currentEnemyTarget.enemyHP.currentHp > 0f;
}
✅ このコードのポイント
firingInterval
(発射間隔の秒数)を追加し、クールタイムを設定nextFireTime
を使用して、一定間隔ごとに弾を発射Shootable()
を作成し、ターゲットがいるか・弾が存在するかを判定- 発射間隔 (
firingInterval
) に応じてnextFireTime
を更新
② Unityエディタで発射間隔の調整
発射間隔を適切に設定するために、Unityエディタで firingInterval
の値を調整できます。
FireWeapon
を選択- 「Inspector」ウィンドウで
WeaponControl
のFiring Interval
を確認 - 値を調整(例: 1.5秒に設定してみる)
- Unityを再生して、一定間隔で弾が発射されるか確認
③ Unityエディタで動作確認
動作確認手順
- Unityを再生(▶ボタンをクリック)
- 敵 (
Enemy
) をFireWeapon
の攻撃範囲に移動 - 弾が適切な間隔で発射されるか確認
- 発射スピードが速すぎたり遅すぎたりしないか
firingInterval
を調整 Console
ウィンドウでDebug.Log()
を使って、発射タイミングが正しく処理されているか確認
✅ 弾が一定間隔ごとに発射される
✅ ターゲットがいない場合、発射されない
✅ firingInterval
を変更すると、発射スピードが変化する

これで、「弾の発射間隔を調整し、一定時間ごとに発射される処理」 が完成しました!
よくある質問(FAQ)
- Q武器が攻撃範囲内の敵を認識しない
- A
Enemyオブジェクトに “Enemy” タグ が設定されているか確認してください。また、CircleCollider2D の IsTrigger にチェックを入れましょう。
- Q弾が発射されないのですが?
- A
FireWeapon の BulletSpawnPos に正しい位置が設定されているか確認してください。また、fireBullet にPrefab化した弾がアタッチされているかも確認しましょう。
- Q弾が敵を追尾しません
- A
Weaponスクリプトで currentEnemyTarget に敵が適切に設定されているか確認してください。また、OnTriggerEnter2D のデバッグログを一度有効にして、敵がリストに追加されているか確認しましょう。