【C#】Queue と Stack の基本や使い方、活用方法を解説

【C#】Queue と Stack の基本や使い方、活用方法を解説

プログラミング言語 C# において、Queue Stack はデータを効率的に扱うための重要なコレクションです。特に、Unity を使ってゲーム開発を行う際にも、これらの構造は役立つことが多いです。

ジェネリックコレクションを使うために、下記のusingディレクティブが必要です。

using System.Collection.Generic;

この記事では、Queue Stack の基本や使い方を解説します。

Queue(キュー)と Stack(スタック)の違い

Queue とは

Queue は「先入れ先出し」(FIFO: First In, First Out)の原則に基づくコレクションです。

これは、最初に追加された要素が最初に取り出されることを意味します。

queue-explanation

Stack とは

Stack は「後入れ先出し」(LIFO: Last In, First Out)の原則に基づくコレクションです。

これは、最後に追加された要素が最初に取り出されることを意味します。

stack-explanation

Queue の基本的な操作

生成

Queue インスタンスを生成します。

Queue<int> queue = new Queue<int>();

追加(Enqueue)

Enqueue メソッドを使って要素を追加します。

queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);

取り出し(Dequeue)

Dequeue メソッドで要素を取り出します。この操作は、キューから要素を削除します。

int first = queue.Dequeue();  // 1 を取り出す

覗き見(Peek)

Peek メソッドで次に取り出される要素を確認できますが、キューからは削除されません。

int next = queue.Peek();  // 2 を確認する

Queue の活用方法

イベント処理

ゲーム内で発生するイベント(例えばプレイヤーのアクションやゲーム内の特定のトリガー)をキューに格納し、順序良く処理します。これにより、イベントが発生した順に適切に対応することができます。

AI タスク管理

AI キャラクターが行うべきタスクをキューに追加し、一つずつ実行します。例えば、敵キャラクターがプレイヤーを追跡し、攻撃し、撤退するといった一連のアクションを管理するのに適しています。

リソースのロード管理

ゲームのリソース(画像、音声、データ等)を必要な順番でロードする際にキューを使用します。これにより、必要なリソースが最適なれ、ゲームのパフォーマンスを向上させることができます。

Stack の基本的な操作

生成

Stackインスタンスを生成します。

Stack<int> stack = new Stack<int>();

追加(Push)

Push メソッドを使って要素を追加します。

stack.Push(1);
stack.Push(2);
stack.Push(3);

取り出し(Pop)

Pop メソッドで要素を取り出します。この操作は、スタックから要素を削除します。

int last = stack.Pop();  // 3 を取り出す

覗き見(Peek)

Peek メソッドで次に取り出される要素を確認できますが、スタックからは削除されません。

int next = stack.Peek();  // 2 を確認する

Stack の活用方法

アンドゥ/リドゥ機能

ゲーム内でのプレイヤーのアクションをスタックに保存し、後から「元に戻す(Undo)」や「やり直し(Redo)」の機能を実装できます。これは特にパズルゲームやエディタツールで役立ちます。

ゲームの状態管理

ゲームの進行状態やシーンの変更をスタックで管理します。プレイヤーが新しいシーンに進むたびにスタックに追加し、戻る際にはスタックからポップして以前の状態に戻ります。

コマンドパターンの実装

プレイヤーのアクションやゲーム内のイベントをコマンドとしてスタックに保存し、それらを逆順に実行することで、複雑なゲームのロジックを管理できます。

ダイアログシステム

ゲーム内のダイアログや選択肢をスタックに積み、プレイヤーが選択を進めるごとにスタックから取り出して表示します。これにより、非線形なストーリーテリングや複数の選択肢に基づく分岐を実現できます。

おわりに

この記事では、C# における Queue Stack の基本的な使い方と、ゲーム開発におけるそれらの活用方法を解説しました。これらのデータ構造は、シンプルながらも非常に強力で、ゲームのロジックやデータの管理を効率的かつ直感的に行うための鍵となります。

これらのデータ構造を活用することで、皆さんのゲーム開発の一助となれば幸いです。

参考リンク

関連記事

【C#】配列、List、Dictionaryの初期化方法まとめ 【C#】配列, List, Dictionary の初期化方法まとめ Linqメソッド簡易解説&使い方まとめ 【C#】 LINQ の各メソッドの紹介と使い方まとめ(Select, Where など)