Unityゲームの作り方メモタワーディフェンス

【Unity】2Dタワーディフェンスゲームの作り方②!武器配置と弾の発射を実装

Unity
  1. 1. はじめに
    1. 必要な準備(前回の記事の復習)
  2. 2. 武器の配置
    1. ① FireWeaponオブジェクトの作成
    2. ② 攻撃範囲を指定するための CircleCollider2D の追加
    3. ③ FireWeaponの子オブジェクトとして platform と rotatePoint を作成
    4. ④ platform に SpriteRenderer を追加し、画像を設定
    5. ⑤ rotatePoint の子オブジェクトとして WeaponImage と BulletPos を作成
    6. ⑥ SortingLayerの設定
    7. ⑦ BulletPos の位置調整
  3. 3. 武器のスクリプトの作成
    1. ① Weapon スクリプトの作成
    2. ② スクリプトの解説
    3. ③ Weapon スクリプトを FireWeapon にアタッチ
    4. ④ Unityエディタで動作確認
  4. 4. 弾の作成
    1. ① Bulletオブジェクトの作成
    2. ② SpriteRenderer の追加
    3. ③ SortingLayer を Bullet に変更
    4. ④ Bulletスクリプトの作成
    5. ⑤ Bulletスクリプトを Bullet にアタッチ
    6. ⑥ BulletのPrefab化
  5. 5. 弾のスクリプトの作成
    1. ① Enemy スクリプトの修正
    2. ② Bullet スクリプトの作成
    3. ③ Unityエディタで動作確認
    4. ④ 動作確認用コードを削除
  6. 6. 武器のリロード実装
    1. ① WeaponControl スクリプトの作成
    2. ② WeaponControl スクリプトの解説
    3. ③ WeaponControl を FireWeapon にアタッチ
    4. ④ BulletSpawnPos に BulletPos を設定
    5. ⑤ fireBullet に弾のPrefabを設定
    6. ⑥ Unityエディタで弾の発射を確認
  7. 7. 弾を敵に追尾させる
    1. ① Weapon スクリプトの修正
    2. ② Bullet スクリプトの修正
    3. ③ WeaponControl スクリプトの修正
    4. ④ Unityエディタで弾が敵を追尾するか確認
  8. 8. 弾が敵に当たったときの処理
    1. ① Bullet スクリプトの修正
    2. ② WeaponControl スクリプトの修正
    3. ③ Unityエディタで動作確認
  9. 9. 弾の発射間隔を調整
    1. ① WeaponControl スクリプトの修正
    2. ② Unityエディタで発射間隔の調整
    3. ③ Unityエディタで動作確認
  10. よくある質問(FAQ)
    1. 関連記事:

1. はじめに

2Dタワーディフェンスゲームを作るにあたって、前回の記事では 「敵の配置・アニメーション・HPバーの実装」 までを行いました。今回の記事では、「武器の設置・敵の攻撃範囲設定・弾の発射とリロード」 について詳しく解説していきます。

タワーディフェンスゲームでは、敵の侵入を防ぐために「武器」が自動で攻撃を行う仕組み が重要です。この記事では、以下の内容を学ぶことができます。

この記事で学べること

✅ 武器(砲台)の配置と攻撃範囲の設定
✅ 敵に向かって発射される弾の作成
✅ 弾が敵を追尾し、ダメージを与える仕組み
✅ 武器のリロードと発射間隔の調整

この内容をマスターすれば、タワーディフェンスゲームの基本的な攻撃システム を実装することができます!

2Dタワーディフェンスゲームを一から作るのは楽しいですが、効率的に開発したいならアセットを活用するのもおすすめ です。例えば、Tower Defense Toolkit 4 (TDTK-4)というアセットを使えば、タワーディフェンスに必要な機能が揃っており、すぐにゲーム開発を始められます。


必要な準備(前回の記事の復習)

前回の記事では、以下のことを実装しました。

  1. 敵の配置
    • Empty オブジェクトを作成し、SpriteRenderer で敵の画像を設定
    • BoxCollider2D で当たり判定を追加
    • Rigidbody2DBodyTypeKinematic に設定
  2. 敵のアニメーション
    • EnemyWalk アニメーションの作成(歩行モーション)
    • EnemyHit アニメーションの作成(攻撃を受けた際のモーション)
    • Animator を使ったアニメーションの遷移設定
  3. HPバーの実装
    • CanvasWorld Space に設定
    • 赤(背景)と緑(HPバー)の Image を配置
    • EnemyHP スクリプトでHPの管理とダメージ処理を実装

また、クリックで敵にダメージを与える処理 も追加しました。
今回の記事では、この仕組みをさらに発展させ、プレイヤーが操作しなくても「武器」が自動で敵を攻撃するようにします」

それでは、さっそく武器の設置から始めていきましょう!




2. 武器の配置

タワーディフェンスゲームでは、敵を迎撃するために「武器(砲台)」を配置する必要があります。ここでは、武器のオブジェクトを作成し、攻撃範囲の設定や弾を発射する準備 を行っていきます。


① FireWeaponオブジェクトの作成

まずは、武器の親オブジェクトとなる FireWeapon を作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
  2. 「Create Empty」を選択
  3. 名前を「FireWeapon」に変更

このオブジェクトが武器全体の基盤となります。


② 攻撃範囲を指定するための CircleCollider2D の追加

武器が敵を検知できるようにするため、攻撃範囲 を表す CircleCollider2D を追加します。

  1. FireWeapon を選択
  2. インスペクター(Inspector)ウィンドウで「Add Component」をクリック
  3. 「CircleCollider2D」を追加
  4. 「Is Trigger」にチェックを入れる(敵を検知するため)

これで、武器が敵の接近を感知できるようになります。


③ FireWeaponの子オブジェクトとして platform と rotatePoint を作成

次に、武器を構成する2つのオブジェクトを作成します。

  1. FireWeapon を選択した状態で、右クリック → 「Create Empty」 を選択
  2. 名前を「platform」に変更
  3. もう一度、右クリック → 「Create Empty」 を選択し、名前を「rotatePoint」に変更

この2つのオブジェクトは、以下の役割を持ちます。

  • platform → 武器の土台(砲台のベース)
  • rotatePoint → 武器の回転ポイント(銃身や砲身を回転させる)

作成したら、それぞれの Transform をリセットしておきましょう。

  1. platform を選択
  2. インスペクターの「Transform」の「Reset」ボタンをクリック
  3. rotatePoint も同様にリセット



④ platform に SpriteRenderer を追加し、画像を設定

砲台のベースとなる platform に画像を設定します。

  1. platform を選択
  2. 「Add Component」→ 「SpriteRenderer」 を追加
  3. 用意した画像を「Sprite」に設定

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


⑤ rotatePoint の子オブジェクトとして WeaponImage と BulletPos を作成

武器の銃身(砲身)と弾の発射位置を作成します。

  1. rotatePoint を選択した状態で、右クリック → 「Create Empty」
  2. 名前を「WeaponImage」に変更
  3. もう一度、右クリック → 「Create Empty」 を作成し、名前を「BulletPos」に変更

次に、WeaponImage に見た目となる画像を設定します。

  1. WeaponImage を選択
  2. 「Add Component」→ 「SpriteRenderer」 を追加
  3. 用意した武器の画像を「Sprite」に設定

⑥ SortingLayerの設定

ゲームオブジェクトの表示順を正しくするために、Sorting Layer を設定します。

  1. 「Window」メニューから「Rendering」→「Sorting Layers」を開く
  2. 「+」ボタンをクリックして以下のレイヤーを作成
    • Node(ノード用)
    • Enemy(敵用)
    • Weapon(武器用)
    • Bullet(弾用)
    • UI(ユーザーインターフェース用)

Sorting Layer は、数値が大きいほど前面に表示される 仕組みです。

  • platformWeaponImage の Sorting Layer を「Weapon」に設定
  • WeaponImage の Order in Layer を 1 に設定platform より前面に表示)

⑦ BulletPos の位置調整

弾の発射位置である BulletPos の位置を調整します。

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

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

ここまでで、武器の基本的な配置と攻撃範囲の設定が完了 しました!
次のステップでは、武器が敵を検知し、弾を発射するスクリプトを作成 していきます!




3. 武器のスクリプトの作成

武器を配置したら、次は 「敵が攻撃範囲に入ったかどうかを判定するスクリプト」 を作成します。
このスクリプトを使って、敵が一定距離内に近づいたときに検知する処理 を実装していきます。


① Weapon スクリプトの作成

まずは Weapon スクリプトを作成します。

  1. 「Project」ウィンドウで「Scripts」フォルダを開く
  2. 「Scripts」フォルダ内に「Weapon」フォルダを作成
  3. Weaponフォルダ内で右クリック → 「Create」→「C# Script」 を選択
  4. スクリプトの名前を「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 という変数を作成し、攻撃範囲の半径を指定
  • CircleCollider2DradiusattackRange に設定

攻撃範囲の可視化

  • OnDrawGizmos() を使って、シーンビュー上で攻撃範囲を赤い円で表示

敵を検知する処理

  • OnTriggerEnter2D() → 敵 (Enemy タグがついたオブジェクト) が攻撃範囲に入るとログを表示
  • OnTriggerExit2D() → 敵が攻撃範囲から出るとログを表示



③ Weapon スクリプトを FireWeapon にアタッチ

作成したスクリプトを、武器オブジェクトに適用します。

  1. ヒエラルキーで FireWeapon を選択
  2. ドラッグアンドドロップし、スクリプトを追加

これで、FireWeapon にスクリプトが適用されました!


④ Unityエディタで動作確認

動作確認のため、Enemy オブジェクトを攻撃範囲に入れてログをチェック しましょう。

  1. ヒエラルキーで Enemy を選択し、「Inspector」で Tag を「Enemy」に設定」
  2. FireWeaponCircleCollider2DIsTrigger にチェックが入っているか確認
  3. Unityを再生(▶ボタンをクリック)
  4. EnemyFireWeapon の攻撃範囲内に手動で移動
  5. 「Console」ウィンドウで Debug.Log() のメッセージが表示されるか確認

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

これで 「武器が攻撃範囲内の敵を検知する」 仕組みが完成しました!
次のステップでは、実際に弾を発射する処理 を作成していきます!




4. 弾の作成

武器が攻撃範囲内の敵を検知できるようになったので、次は 「弾(Bullet)」 を作成します。
ここでは、弾のオブジェクトを作成し、見た目を設定してPrefab化 します。


① Bulletオブジェクトの作成

まずは、弾のベースとなるオブジェクト を作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリック
  2. 「Create Empty」を選択
  3. 名前を「Bullet」に変更
  4. Bullet を選択し、インスペクター(Inspector)で「Reset Transform」ボタンを押す
    • Position (0,0,0)
    • Rotation (0,0,0)
    • Scale (1,1,1)

これで、弾の基盤となるオブジェクトが作成されました。


② SpriteRenderer の追加

弾の見た目を設定するため、SpriteRenderer を追加します。

  1. Bullet を選択した状態で、「Inspector」の「Add Component」をクリック
  2. 「SpriteRenderer」を追加
  3. 用意した弾の画像を Sprite に設定

③ SortingLayer を Bullet に変更

弾が適切な表示順で描画されるように SortingLayer を設定します。

  1. 「Window」→「Rendering」→「Sorting Layers」を開く
  2. 「+」ボタンをクリックし、新しいレイヤー「Bullet」を作成
  3. BulletSpriteRenderer の「Sorting Layer」を「Bullet」に設定

これで、弾が敵や武器と適切な順番で表示されるようになります。




④ Bulletスクリプトの作成

弾の動きを制御するために、新しくスクリプトを作成します。

  1. 「Project」ウィンドウで「Scripts」フォルダを開く
  2. 「Weapon」フォルダ内で右クリック → 「Create」→「C# Script」
  3. スクリプトの名前を「Bullet」に変更

⑤ Bulletスクリプトを Bullet にアタッチ

作成したスクリプトを、弾のオブジェクトに適用します。

  1. ヒエラルキーで Bullet を選択
  2. 「Inspector」ウィンドウの「Add Component」をクリック
  3. 検索バーに「Bullet」と入力し、スクリプトを追加

これで、Bullet にスクリプトが適用されました。


⑥ BulletのPrefab化

弾のオブジェクトをPrefab化して、ゲーム中に複数発射できるように します。

  1. 「Project」ウィンドウで「Prefabs」フォルダを作成(まだない場合)
  2. Bullet を「Prefabs」フォルダにドラッグ&ドロップ
  3. ヒエラルキーから Bullet を削除(Prefab化されたので不要)

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

これで、「弾の作成とPrefab化」 が完了しました!
次のステップでは、弾のスクリプトを実装 していきます!




5. 弾のスクリプトの作成

前のステップで 弾(Bullet) を作成しました。
今回は 弾が敵に向かって飛んでいき、一定の距離まで近づいたらダメージを与えるスクリプト を作成していきます。


① Enemy スクリプトの修正

弾が敵にダメージを与えられるように、Enemy スクリプトに HP管理用のコード を追加します。

  1. 「Project」ウィンドウで Scripts/Enemy フォルダを開く
  2. 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 スクリプトの作成

次に、弾が敵に向かって飛んでいき、一定距離まで近づいたらダメージを与える処理を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 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エディタで動作確認

スクリプトの動作を確認して、弾が敵に向かって飛んでいくか をチェックします。

動作確認手順

  1. Unityを再生(▶ボタンをクリック)
  2. シーンビューまたはゲームビューで Enemy の位置を確認
  3. 敵に向かって弾が飛んでいくか確認
  4. 弾が敵に当たると Console ウィンドウにログが出るか確認
    • Debug.Log("ダメージを与えた"); などのログを追加してチェック

弾が敵に向かって飛んでいく
敵に当たると Debug.Log() でログが出る


④ 動作確認用コードを削除

弾が正しく敵に飛んでいくことを確認したら、Start() 内の動作確認用コードを削除 します。

修正前

private void Start()
{
// 動作確認用のコード 不要になったら消去
enemyTarget = FindObjectOfType<Enemy>();
}

修正後

private void Start()
{
// ここにはターゲット設定の処理を後で追加
}

これで、弾が敵に向かって移動し、一定の距離でダメージを与える処理 が実装できました!
次のステップでは、武器が弾を発射するスクリプト(WeaponControl)を作成 していきます!




6. 武器のリロード実装

武器が弾を発射するためには、弾を装填(リロード)する仕組み が必要です。
このステップでは、武器が弾を発射し、発射後にリロードして新しい弾を装填するスクリプト を作成します。


① WeaponControl スクリプトの作成

まず、武器のリロードを管理する WeaponControl スクリプトを作成します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 「右クリック」→「Create」→「C# Script」 を選択
  3. スクリプトの名前を WeaponControl に変更
  4. 作成したスクリプトをダブルクリックして開く

以下のコードを入力してください。

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 スクリプトの解説

このスクリプトでは、以下の動作を実装しています。

WeaponControlFireWeapon にアタッチし、弾をリロードする処理を管理
bulletSpawnPos(弾の発射位置)を指定し、そこに弾を生成
弾が存在しない場合は ReloadBullet() を実行し、新しい弾を装填
fireBullet に設定した Bullet のPrefabを元に新しい弾を作成


③ WeaponControl を FireWeapon にアタッチ

作成したスクリプトを、武器オブジェクトに適用します。

  1. ヒエラルキーで FireWeapon を選択
  2. 「Inspector」ウィンドウの「Add Component」をクリック
  3. 検索バーに「WeaponControl」と入力し、スクリプトを追加



④ BulletSpawnPos に BulletPos を設定

弾の発射位置を設定するために、BulletSpawnPosBulletPos をアタッチ します。

  1. ヒエラルキーで FireWeapon を選択
  2. 「Inspector」ウィンドウで WeaponControlbulletSpawnPos の欄を探す
  3. 「ヒエラルキー内の BulletPos をドラッグ&ドロップ」して bulletSpawnPos に設定

⑤ fireBullet に弾のPrefabを設定

弾の発射には Bullet のPrefabが必要なので、fireBullet にPrefabを設定 します。

  1. 「Project」ウィンドウで Prefabs フォルダを開く
  2. 作成済みの Bullet プレハブを探す
  3. WeaponControlfireBullet の欄に Bullet プレハブをドラッグ&ドロップ

⑥ Unityエディタで弾の発射を確認

すべての設定が完了したら、実際に Unityエディタで弾の発射を確認 してみましょう。

動作確認手順

  1. Unityを再生(▶ボタンをクリック)
  2. シーンビューまたはゲームビューで FireWeaponBulletSpawnPos を確認
  3. 弾が適切に生成されているかチェック
  4. Console ウィンドウを開き、Debug.Log() でリロードが動作しているか確認

弾が正しく生成され、BulletSpawnPos の位置に装填される
発射後に新しい弾が装填される

これで、「弾をリロードし、新しい弾を装填する仕組み」 が完成しました!
次のステップでは、実際に武器が敵を狙って弾を発射する処理 を作成していきます!




7. 弾を敵に追尾させる

これまでのステップで 弾を発射し、敵に当たるとダメージを与える 仕組みを作成しました。
しかし、現在の弾は適当な敵をターゲットにして飛んでいく だけで、最も近い敵を優先して狙う処理 がありません。

このステップでは、敵をリスト管理し、最も近い敵をターゲットにして弾を追尾 する機能を実装します。


① Weapon スクリプトの修正

まず、攻撃範囲内の敵を管理し、最も近い敵をターゲットにする処理 を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 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() を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. Bullet スクリプトを開き、以下の関数を追加
/// <summary>
    /// 攻撃対象を設定する
    /// </summary>
    /// <param name="enemy"></param>
    public void SetTargetEnemy(Enemy enemy) 
    {
        enemyTarget = enemy;
    }

このコードのポイント

  • SetTargetEnemy(Enemy enemy) を呼び出すことで、弾のターゲットを動的に変更可能
  • 武器が攻撃する敵を決定した後、弾がその敵を追尾する



③ WeaponControl スクリプトの修正

次に、WeaponControlUpdate() 内で ターゲットを取得して弾に設定 する処理を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. WeaponControl スクリプトを開き、Update() 内の if 文に else を追加
else 
        {
            currentBullet.SetTargetEnemy(weapon.currentEnemyTarget);
        }

このコードのポイント

  • 弾がない場合はリロード
  • 弾がある場合は、ターゲットの敵を設定

④ Unityエディタで弾が敵を追尾するか確認

スクリプトを修正したら、Unityエディタで動作を確認 しましょう。

動作確認手順

  1. Unityを再生(▶ボタンをクリック)
  2. 敵 (Enemy) を FireWeapon の攻撃範囲に移動
  3. 弾が自動的に Enemy に向かって飛んでいくか確認
  4. Console ウィンドウを開き、Debug.Log() のメッセージが正しく出力されるか確認

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

これで、「弾が最も近い敵をターゲットにして追尾する仕組み」 が完成しました!
次のステップでは、敵に当たったら弾を消滅させる処理 を追加していきます!




8. 弾が敵に当たったときの処理

これまでのステップで、弾が敵を追尾する仕組み を実装しました。
しかし、現時点では 弾が敵に当たった後も残り続けてしまう ため、適切に 弾を消去し、ダメージを与える処理 を追加します。


① Bullet スクリプトの修正

まず、弾が敵に当たったらダメージを与えて消える処理 を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 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 に弾のリセット処理 を追加します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 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エディタで動作確認

動作確認手順

  1. Unityを再生(▶ボタンをクリック)
  2. 敵 (Enemy) を FireWeapon の攻撃範囲に移動
  3. 弾が Enemy に向かって飛んでいくことを確認
  4. 敵に当たった弾が消えることを確認
  5. 敵のHPが減少することを確認
  6. Console ウィンドウで Debug.Log() を有効にして、処理が適切に動いているかチェック

弾が敵をターゲットにして飛んでいく
敵に当たると Destroy(gameObject); により弾が消える
ReduceHP(damage); により敵のHPが減る

これで、「弾が敵に当たると消え、適切にダメージを与える処理」 が完成しました!
次のステップでは、弾の発射間隔を調整し、バランスの取れた戦闘システムを実装 していきます!




9. 弾の発射間隔を調整

これまでの実装で、武器が敵をターゲットにして弾を発射し、ダメージを与える仕組み は完成しました。
しかし、現在は 弾が無限に発射され続ける状態 になっているため、適切な 発射間隔(クールタイム) を設定して、一定時間ごとに弾を発射する 仕組みを作ります。


① WeaponControl スクリプトの修正

まず、発射間隔を制御する変数とロジックを追加 します。

  1. 「Project」ウィンドウで Scripts/Weapon フォルダを開く
  2. 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 の値を調整できます。

  1. FireWeapon を選択
  2. 「Inspector」ウィンドウで WeaponControlFiring Interval を確認
  3. 値を調整(例: 1.5秒に設定してみる)
  4. Unityを再生して、一定間隔で弾が発射されるか確認

③ Unityエディタで動作確認

動作確認手順

  1. Unityを再生(▶ボタンをクリック)
  2. 敵 (Enemy) を FireWeapon の攻撃範囲に移動
  3. 弾が適切な間隔で発射されるか確認
  4. 発射スピードが速すぎたり遅すぎたりしないか firingInterval を調整
  5. Console ウィンドウで Debug.Log() を使って、発射タイミングが正しく処理されているか確認

弾が一定間隔ごとに発射される
ターゲットがいない場合、発射されない
firingInterval を変更すると、発射スピードが変化する

これで、「弾の発射間隔を調整し、一定時間ごとに発射される処理」 が完成しました!




よくある質問(FAQ)

Q
武器が攻撃範囲内の敵を認識しない
A

Enemyオブジェクトに “Enemy” タグ が設定されているか確認してください。また、CircleCollider2D の IsTrigger にチェックを入れましょう。

Q
弾が発射されないのですが?
A

FireWeapon の BulletSpawnPos に正しい位置が設定されているか確認してください。また、fireBullet にPrefab化した弾がアタッチされているかも確認しましょう。

Q
弾が敵を追尾しません
A

Weaponスクリプトで currentEnemyTarget に敵が適切に設定されているか確認してください。また、OnTriggerEnter2D のデバッグログを一度有効にして、敵がリストに追加されているか確認しましょう。

タイトルとURLをコピーしました