[UNITY]アクションゲームを作る(ステージをファイルから取得)[9]

どうも、仕事なんとかなったえんちゃです。
前回で基本的なアクションゲームが出来ましたー!
ゴールを設定する

いままでステージをペイントで書いていましたね。
まぁマリオメーカーみたいにとかは言わないけど、数値的にキレイにステージを作っていきたいですね。

ということで、今回は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; をつけたのは単にオブジェクト整理のためです。
空オブジェクトにアタッチしてあげて実行すると底にデータが格納されます。

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

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

コメント

タイトルとURLをコピーしました