別に Unity やゲーム開発に限った話じゃないと思うけどプログラムで、配列などに入れて順番に処理したい、という事がある。最初は配列やリストのメソッドに良いの無いかなーと思って探してみたら、C# であれば Queue 及び Stack を使うと簡単に実現できる事を知った。
Queue は First In First Out と言われ先に入れたものを先に取り出す。
一方 Stack は Last in First Out もしくは First In Last Out と言われ最後に入れたものを先に取り出す。
どちらも基本的なデータ構造ですが僕が使ってた他の言語(PHP とか Ruby とか)だと配列のメソッドを組み合わせて実現するんですよね。C# ではそれぞれクラスが用意されてます。便利ですね?
というわけで使ってみよう。
Queue
Enqueue でデータ入れて Dequeue で先に入っていたものを取り出す。
以下の例では string を queue に入れているが int でも boolean でも自分で作ったクラスでもなんでもいける。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class QueueTest : MonoBehaviour {
void Start () {
Queue<string> queue = new Queue<string>(){};
queue.Enqueue("kongo");
queue.Enqueue("hiei");
queue.Enqueue("haruna");
queue.Enqueue("kirishima");
Debug.Log("queue.Count:" + queue.Count);
foreach (string name in queue) {
Debug.Log("name:" + name);
}
while (queue.Count > 0) {
Debug.Log("queue.Dequeue():" + queue.Dequeue());
}
Debug.Log("queue.Count:" + queue.Count);
}
}
結果は以下のようになる。
先に入れた kongo から出てきてますね。
Stack
Push でデータを入れて Pop で後から入れたものを取り出す。他は queue と同様。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class StackTest : MonoBehaviour {
void Start () {
Stack<string> stack = new Stack<string>(){};
stack.Push("kongo");
stack.Push("hiei");
stack.Push("haruna");
stack.Push("kirishima");
Debug.Log("stack.Count:" + stack.Count);
foreach (string name in stack) {
Debug.Log("name:" + name);
}
while (stack.Count > 0) {
Debug.Log("stack.Pop():" + stack.Pop());
}
Debug.Log("stack.Count:" + stack.Count);
}
}
queue とは逆に kirishima から出てくる。
わりとこういった処理は使うので覚えておくと便利だ。