今回はC#でQueueを使ってみようと思います。
キューはデータ構造のひとつで、先に登録したデータから取り出すという特徴を持ってます。
いわゆる待ち行列と同じですね。
並んだ順番に店内に案内されるのと同じです。
Unityでキューを表現したサンプルを作ってみました。
↑のようになります。
↑のサンプルではキューに赤、緑、青のCubeをボタンで登録が出来るようにし、デキューボタンを押したらデータの取り出し、Peekボタンで最初に登録したデータの取得が出来ます。
キューには4つのデータのみ登録出来るようにし、新しいデータが登録される度にデキューして最初のデータを取り出しています。
Queueを使う
というわけで、C#でQueueを使ってみましょう。
Queueの宣言
Queueはリスト等と同じように宣言します。
例えばint型の値を登録するキューを宣言する場合は、
1 2 3 | Queue<int> queue = new Queue <int>(); |
↑のようにします。
Queueにデータを登録する
キューにデータを登録する事をEnqueueと言います。
queueというQueueクラスの変数が宣言されているとします。
登録にはEnqueueメソッドを使用し、引数に登録するデータを渡します。
1 2 3 | queue.Enqueue (0); |
↑の例ではint型の0というデータを登録しています。
Queueからデータを取りだす
キューからデータを取りだすにはDequeueメソッドを使用します。
1 2 3 | int dequeue = queue.Dequeue (); |
デキューすると最初に登録したデータを取り出し、キュークラスから削除します。
Dequeueメソッドの戻り値で取りだしたデータが返って来るので、変数に入れて使用する事が出来ます。
Queueからデータを削除せず取り出す
Dequeueメソッドを使用するとQueueからデータを削除して取り出しますが、Peekメソッドを使うとデータを削除せず先頭のデータを取りだす事が出来ます。
1 2 3 | int peekValue = queue.Peek (); |
Queueデータのクリア
Queueに登録された全てのデータを削除するにはClearメソッドを使用します。
1 2 3 | queue.Clear (); |
Queueデータに該当するデータが存在するかどうか
Queueデータ内に指定したデータが存在するかどうかはContainsメソッドを使用します。
1 2 3 | queue.Contains (0) |
↑の例ではqueueにint型の0が登録されているかどうかを調べる事が出来ます。
Queueデータの登録数
Queueにいくつのデータが登録されているかどうかはCountプロパティで調べる事が出来ます。
1 2 3 | queue.Count |
Queueを使った簡単なスクリプト
Queueの使い方がわかったところで、それらを使ってサンプルを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class QueueTest : MonoBehaviour { private Queue<int> queue = new Queue <int>(); // Use this for initialization void Start () { // 値を追加 queue.Enqueue (0); queue.Enqueue (1); foreach (var item in queue) { Debug.Log ("Queue後: " + item); } // 先頭から値を取得しデータを削除 int dequeue = queue.Dequeue (); Debug.Log ("Dequeueした値: " + dequeue); foreach (var item in queue) { Debug.Log ("Dequeue後: " + item); } queue.Enqueue (10); foreach (var item in queue) { Debug.Log ("10Enqueue後: " + item); } int peekValue = queue.Peek (); Debug.Log ("Peekした値: " + peekValue); foreach (var item in queue) { Debug.Log ("Peek後: " + item); } // キューデータをクリア queue.Clear (); queue.Enqueue (0); // キューに0が存在するか? Debug.Log("キューデータに0が存在するか?: " + queue.Contains (0)); Debug.Log ("キューに登録されている数: " + queue.Count); } } |
終わりに
キューはデータに登録した順番に取りだすようなデータ群を扱いたい時に便利ですね。
受けたダメージをUIで表示する時に最初に受けたダメージ数からUIに表示するといった時や、
テトリスみたいに次に落ちてくるブロックをいくつかデータとして保持しておき、それを入れた順番に取りだしたいといった時ですね。
うーむ・・・あいかわらずいい事例が思い浮かびませぬ・・・・・(-_-)