どうも、仕事なんとかなったえんちゃです。
前回で基本的なアクションゲームが出来ましたー!
ゴールを設定する
いままでステージをペイントで書いていましたね。
まぁマリオメーカーみたいにとかは言わないけど、数値的にキレイにステージを作っていきたいですね。
ということで、今回はCSVでステージを作って、それをUNITY上でオブジェクトにするという処理を作っていきます。
まずは、0を空白,1を床として、EXCELでステージを作ってみます。

このあと、CSV形式で保存します。
今回大事な関数は3つで
1つは、外部ファイルを読み込むときの関数です。
Resources.Load([ファイル名])
これは、Asset > Resources ファイルのデータを取得するメソッドでPrefabや、テキストファイルなどなんでも呼び出すことが出来ます。
しかしResourcesに格納されているファイルデータはゲーム作成時に圧縮されないので、入れるデータは最低限にするといいです。
もう一つは テキストファイルなどを読み込むStringReader変数から1行づつ読み取っていく
[StringReader 変数].ReadLine();
これでCSVファイルを1行づつ読み取り、さらにそのデータをSplit変数でカンマで分割していきます。
最後にインスタンス化です。
Instantiate (Object original, Vector3 position, Quaternion rotation);
originalにCSVの番号(記号)に対応するプレハブ[GameObject]を指定し、
position に座標を書いていきます。
今回、オブジェクトの回転は必要ないので Quaternion rotation を使用していきます。
これで数字に対応するプレハブとCSVデータをResourcesフォルダに入れてあげれば準備完了です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class CreateStage : MonoBehaviour
{
public GameObject stageFolder;
private List csvDatas = new List(); // CSVの中身を入れるリスト;
private GameObject obj;
public void ReadStageData()
{
TextAsset csvFile = Resources.Load("StageData/stage1") as TextAsset; // Resouces下のCSV読み込み
StringReader reader = new StringReader(csvFile.text);
string ObjectAddress = "Object/";
// , で分割しつつ一行ずつ読み込み
// リストに追加していく
int maxX = -1;
int maxY = -1;
string line = "";
while (reader.Peek() != -1) // reader.Peaekが-1になるまで
{
line = reader.ReadLine(); // 一行ずつ読み込み
csvDatas.Add(line.Split(',')); // , 区切りでリストに追加
maxY++;
}
maxX = CountChar(line, ',');
for (int x = 0; x <= maxX; ++x) // yを1~9まで、1ずつ増やして繰り返し
{
for (int y = 0; y <= maxY; ++y) // yを1~9まで、1ずつ増やして繰り返し
{
if (csvDatas[y][x] != "0")
{
CreateStageObject(maxY - y, x, ObjectAddress + csvDatas[y][x]);
}
}
}
}
//プレハブを作成する
private void CreateStageObject(int y, int x, string objname)
{
obj = Instantiate((GameObject)Resources.Load(objname), new Vector3(x, y, 0), Quaternion.identity);
obj.transform.parent = transform;//オブジェクトの中に入れる
}
//列数をカウントする
public static int CountChar(string s, char c)
{
return s.Length - s.Replace(c.ToString(), "").Length;
}
}
obj.transform.parent = transform; をつけたのは単にオブジェクト整理のためです。
空オブジェクトにアタッチしてあげて実行すると底にデータが格納されます。

以上、ステージが生成されました。

実はこれ、オブジェクトが多すぎると、やっぱりというか負荷がかかるらしいです。
現時点で自分の実力では修正できないので、またの機会に続きを書きます。


コメント