どうも、仕事なんとかなったえんちゃです。
前回で基本的なアクションゲームが出来ましたー!
ゴールを設定する
いままでステージをペイントで書いていましたね。
まぁマリオメーカーみたいにとかは言わないけど、数値的にキレイにステージを作っていきたいですね。
ということで、今回は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; をつけたのは単にオブジェクト整理のためです。
空オブジェクトにアタッチしてあげて実行すると底にデータが格納されます。
以上、ステージが生成されました。
実はこれ、オブジェクトが多すぎると、やっぱりというか負荷がかかるらしいです。
現時点で自分の実力では修正できないので、またの機会に続きを書きます。
コメント