はじめに
最近ゲーム制作をしており、その時に「このプログラムならキューを用いたら出来そうじゃない?」と思い、その時に実装したものを掲載しています。
どんなものを作ったの?
私が今回作成したのは、プレイヤーが走るためのステージ自動生成機能の実装です。以下がその機能を実装したものとなります。
プレイヤーの動きに対して、良い感じにステージが自動生成及び自動削除されてますね!!
以下がステージ生成と削除のコードになります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StageGenerator : MonoBehaviour
{
int StageSize = 30;
int StageIndex;
public int numberOfStages;
private Queue<GameObject> stageQueue = new Queue<GameObject>();
public Transform Target;//Player
public GameObject[] stageTips;//ステージのプレハブ
public int FirstStageIndex;//スタート時にどのインデックスからステージを生成するのか
public int aheadStage; //事前に生成しておくステージ
// Start is called before the first frame update
void Start()
{
// 初めに生成
for(int i = 0; i < numberOfStages; i++)
{
stageQueue.Enqueue(MakeStage(StageIndex));
StageIndex++;
}
}
// Update is called once per frame
void Update()
{
int targetPosIndex = (int)(Target.position.z / StageSize);
if(targetPosIndex + aheadStage > StageIndex)
{
NextStage();
}
}
void NextStage()
{
GameObject previousStage = stageQueue.Dequeue();
Destroy(previousStage);
stageQueue.Enqueue(MakeStage(StageIndex));
StageIndex++;
}
GameObject MakeStage(int index)
{
int nextStage = Random.Range(0, stageTips.Length);
GameObject stageObject = (GameObject)Instantiate(
stageTips[nextStage],
new Vector3(0, 0, index * StageSize),
Quaternion.identity);
return stageObject;
}
}
###コードの内容と感想
GameObject型のキューを宣言し、EnqueueでstageQueueにnumberOfStage分のデータを登録します。登録データはMakeStageメソッド内で処理されランダムなステージを生成します。NextStageメソッドではでキューを行い、データの削除を行っております。
###キューと、デキューってそもそもなに?
データ構造の一つです。データ構造に入っている要素のうち、最初に登録された要素から順に取り出していくものです。このような動作をFIFO(first in first out)と言います。
似たようなデータ構造としてスタックというものがあります。これは最初に登録された要素が最後に出てくるLIFO(last in first out)の動作を行います。
このデータ構造はいろいろな所で利用されているので、学んでおいて損はないと考えます。私も勉強中です。
######データ構造参考資料
https://qiita.com/drken/items/6a95b57d2e374a3d3292
###さいごに
最近、UnityやらFlutterやら触っている自分ですが、やはりプログラムの根幹にある数学や物理、アルゴリズムについてもっと学ばなくてはいけないなと感じました。これからも日々精進していきたい所存です。
Qiitaにあるコードと同じですがGithubの方にも同様のものを掲載させていただきます。気になったら覗いてください。以下がリンクになります。
https://github.com/keigo194547/GenerateStage