初心者必見!現場レベルの「ゲーム制作講座PDF」を無料プレゼント中!▶

UnityのC#リスト | 敵や弾をまとめて管理

Unity 基礎操作・設定

現在、シーン上の敵・弾・生成物は、ゲームの進行とともに増減します。

固定長の配列だけでは「今いくつあるか」に合わせた管理がしづらく、AddやRemoveのたびに配列を作り直す必要が出てきます。
その中から、Unityゲームでよく使うList(リスト)を押さえておくと、敵一覧や弾の管理がずっと楽になります。

この記事では、ListのAdd/Remove、foreach、配列との使い分け、場に出ている敵をまとめる例まで解説します。
ゲーム制作で頻出のパターンに絞って整理します。

  • 敵や弾の数が変わるのに、配列の作り直しで対応している
  • ListのAddとRemoveのタイミングが分からず、Countが合わない
  • foreach中にRemoveしてエラーが出る

この記事でわかること

  • Listの基本と配列との違い
  • Add/Remove/Clearなどの基本操作
  • foreachで全要素を処理する方法
  • 場に出ている敵一覧の管理例
  • InspectorでListを使う方法
  • 初心者でも理解できる解説

\プログラミング未経験でも大丈夫!まずは1本作り切ろう/

初心者が最初に選ぶならコレ

Unity ノンフィールドRPG
+スレスパ風JRPG講座

★★★★★ (Unity6対応)

Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。

講座を見てみる \ゼロからでもスマホ対応RPGが作れる!/

憧れのアクションゲームに挑戦

Unity 2Dアクションゲーム
の作り方講座(ロックマン風)

★★★★★ (スマホ化・広告実装)

初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。

講座を見てみる \初心者でも本格ACTが完成する!/

3Dゲーム開発の入口はここ

ゼルダ風3Dアクションゲーム
の作り方講座

★★★★★ (スマホ化対応)

「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。

講座を見てみる \初心者でも全16回で3Dゲームが完成!/

Listとは何か

Listは、要素の数を自由に増減できるコレクションです。
System.Collections.Generic名前空間にあり、型を指定して使います。

using System.Collections.Generic;
using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    private List<GameObject> activeEnemies = new List<GameObject>;

    public void RegisterEnemy(GameObject enemy)
    {
        activeEnemies.Add(enemy);
    }
}

List<GameObject>はGameObjectのリスト、List<int>は整数のリスト、という形で型を指定します。
new List<T>で空のリストを作ります。

配列との使い分け

配列とListは似ていますが、用途に違いがあります。

比較項目 配列(T[]) List(List<T>)
要素数 作成時に固定。
後から長さ変更は基本不可
Add/Removeで自由に増減できる
向いている場面 サイズが決まっているデータ(曜日7個、ステージ数固定) 敵・弾など、実行中に増減するオブジェクト
Inspector表示 SerializeFieldで配列をそのまま表示しやすい [SerializeField] Listも表示可能(Unity 2020以降で一般的)

「敵が倒れるたびに減る」「弾を撃つたびに増える」といった動的な管理には、Listの方が向いています。

AddとRemoveの基本操作

リスト操作で最初に覚えるのは、Add(追加)とRemove(削除)です。

List<GameObject> bullets = new List<GameObject>;

// 追加
GameObject bullet = Instantiate(bulletPrefab);
bullets.Add(bullet);

// 特定要素を削除
bullets.Remove(bullet);

// インデックス指定で削除
bullets.RemoveAt(0);

// 全部消す
bullets.Clear;

// 要素数
int count = bullets.Count;

Removeは「同じ参照の要素」を探して削除します。
見つからなければ何もしません。
DestroyしたGameObjectをリストから外し忘れると、null参照が残るので、撃破時やDestroy前にRemoveする習慣をつけましょう。

管理人
管理人

「生成したらAdd、Destroy前にRemove」——この2点セットで覚えると、リスト管理の8割はカバーできます。
Remove忘れがバグの定番なので要注意ですよ。

foreachで全要素を処理する

リスト内のすべての要素に同じ処理をしたいときは、foreachが読みやすいです。

foreach (GameObject enemy in activeEnemies)
{
    if (enemy != null)
    {
        enemy.SendMessage("TakeDamage", 10);
    }
}

ループ中にRemoveすると例外が出ることがあります。
削除しながら回したい場合は、for文を後ろから回すか、削除対象を別リストに溜めてからまとめてRemoveする方法を使います。

for (int i = activeEnemies.Count - 1; i >= 0; i--)
{
    if (activeEnemies[i] == null)
    {
        activeEnemies.RemoveAt(i);
    }
}

場に出ている敵一覧の管理例

Wave制のゲームなどで、全滅判定に使う敵リストの例です。

敵リスト管理の流れ
  • STEP1
    EnemyManagerにListを用意

    activeEnemiesリストをフィールドで宣言
  • STEP2
    敵生成時にAdd

    Spawn時にRegisterEnemyを呼ぶ
  • STEP3
    撃破時にRemove

    TakeDamageやOnDeathでUnregisterEnemyを呼ぶ
public class EnemyManager : MonoBehaviour
{
    private List<GameObject> activeEnemies = new List<GameObject>;

    public void RegisterEnemy(GameObject enemy)
    {
        if (!activeEnemies.Contains(enemy))
            activeEnemies.Add(enemy);
    }

    public void UnregisterEnemy(GameObject enemy)
    {
        activeEnemies.Remove(enemy);
        CheckWaveClear;
    }

    void CheckWaveClear
    {
        if (activeEnemies.Count == 0)
        {
            Debug.Log("Waveクリア!");
        }
    }
}

Containsで重複登録を防ぎ、Count == 0で全滅判定をしています。
敵側のスクリプトから、生成時にRegister、Destroy前にUnregisterを呼ぶ構成がシンプルです。

よく使うListメソッド

ゲーム制作でよく触るメソッドをまとめます。

  • Add:末尾に要素を追加
  • Remove / RemoveAt:要素またはインデックスで削除
  • Contains:要素が含まれるか確認
  • Count:現在の要素数
  • Clear:すべて削除
  • Find / FindAll:条件に合う要素を検索(ラムダ式)
List<Enemy> enemies = new List<Enemy>;
Enemy boss = enemies.Find(e => e.isBoss);
List<Enemy> lowHp = enemies.FindAll(e => e.hp < 10);

Find系はリストが大きいと処理コストが増えるため、毎フレームのUpdateで大量検索する用途には向きません。
必要ならDictionaryなど別の構造も検討しましょう。

InspectorでListを使う

Unityでは、SerializeField付きのListをInspectorに表示できます。

using System.Collections.Generic;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private List<GameObject> enemyPrefabs = new List<GameObject>;
}

敵Prefabの一覧をInspectorで設定し、コード側ではリストのインデックスやforeachで順番に生成する、という使い方ができます。
固定の敵セットなら、Listより配列でも問題ありません。

弾のリスト管理例

プレイヤーの弾を上限付きで管理する例です。
上限を超えたら古い弾からDestroyします。

public class BulletManager : MonoBehaviour
{
    private List<GameObject> bullets = new List<GameObject>;
    [SerializeField] private int maxBullets = 20;

    public void AddBullet(GameObject bullet)
    {
        bullets.Add(bullet);
        if (bullets.Count > maxBullets)
        {
            GameObject oldest = bullets[0];
            bullets.RemoveAt(0);
            Destroy(oldest);
        }
    }
}

インデックス0が最古の弾、というルールで運用しています。
RemoveAt(0)は先頭削除なので、要素数が多いと処理コストが気になる場合はQueueの検討も選択肢です。
初心者のうちはListで十分です。

管理人
管理人

動的に増減する「今フィールドにいる敵」はList、「Wave1のPrefabセット」はInspectorのListや配列、と用途で分けると迷いません。

よくあるつまずき

  • using忘れ → using System.Collections.Generic; が必要
  • Remove忘れ → Destroyしたあともリストに残り、Countが合わない
  • foreach中のRemove → InvalidOperationException。
    後ろからforで削除
  • nullが混ざる → Destroy後の参照。
    定期的にnullチェックで掃除

「Waveクリアなのに次が始まらない」ときは、activeEnemies.Countが本当に0か、Unregisterが呼ばれているかをDebug.Logで確認してください。

管理人
管理人

ListはC#ゲーム制作の定番道具です。
敵を1体SpawnしてAdd、倒してRemove——この往復を1回体験すれば、感覚がつかめますよ。

記事を読んで「作ってみたい!」と思ったら!初心者でも1本完成できる講座で実力をつけよう

知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。プログラミング未経験からでも取り組める講座で、ゲーム開発の第一歩を踏み出しましょう。

Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!初心者でもデッキ構築×JRPGをスマホ向けに作れる!】

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座

  • Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
  • Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
  • 初心者でも迷わず進められる丁寧な解説構成
  • ノンフィールドRPGとデッキ構築JRPGの2つをまとめて学べるセット講座

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、プログラミング未経験の初心者でも取り組みやすい、ステップバイステップ形式の講座です。

Unity6対応・スマホ化対応の最新カリキュラムで、読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。

「何から始めればいいかわからない…」という初心者が最初に選ぶ一本として最適な講座です。

Unity6対応・スマホ化対応の最新カリキュラム
ゼロからでもRPGを完成させよう
→ スレスパ風デッキ構築JRPG講座を見てみる
初心者でもスマホ対応のRPGが作れる!まずは1本完成を目指そう!

Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!初心者でもスマホ化・広告実装まで対応した本格横スクロールACTが作れる!】

Unity 2Dアクションゲームの作り方講座(ロックマン風)

  • ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
  • 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
  • スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
  • 敵AI15体・多彩なマップギミック・武器システムを完全実装
  • 完全オリジナルゲームをアセット不使用で素材提供付きで制作

Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。

全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。

「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。

スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!

ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

ゼルダ風3Dアクションゲームの作り方講座

  • ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
  • 「3Dは難しそう」と感じている初心者でも取り組みやすい丁寧な解説構成
  • スマホ化対応で実機で動かせるゲームが完成
  • アセットを使った実践的なゲーム開発手法が身につく
  • 画像・動画・全ソースコード公開の充実したサポート

ゼルダ風3Dアクションゲームの作り方講座は、「3Dゲームは難しそう…」と感じている初心者こそおすすめの入門講座です。

全16回の丁寧な解説で、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを確実に完成まで導きます。スマホ化対応で実機で動かせるため、初めて3Dゲームを作り上げた達成感がひときわ大きい講座です。

「3Dゲームを自分でも作れるか試してみたい」という初心者の最初の一歩として最適です。

初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の壁を一気に突破しよう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
全16回でスマホで動くオリジナル3Dゲームを完成させよう!

まとめ

C#のListは、Add/Removeで要素数を自由に変えられるコレクションです。
敵や弾のように実行中に増減するオブジェクトの管理に向いており、foreachで全要素を処理できます。

配列はサイズ固定向け、Listは動的管理向け、と使い分けましょう。
生成時にAdd、Destroy前にRemove——この習慣をつけるだけで、Waveクリア判定などが書きやすくなります。
コレクションを含むC#学習を進めたい方は、Unity入門の森で、ゲーム制作と合わせて実践的に身につけられます。
今日はList<GameObject>を1つ作り、SpawnとRemoveを試してみてください。

コメント

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