Star☆Unityメモ

Unityのちょっとしたことをメモって後で見返せれたらいいなサイト

CSVファイルでエネミーのパラメーターを変更してみる

f:id:zvn_X:20170109031112p:plain

Enemyのステータスはスプレッドシートにまとめたい。

  1. モンスターを大量に作っていると、どのモンスターがどのくらいのステータスだったかとかわからなくなってしまう.
  2. チーム開発ではゲームバランスを整える人とプログラムを書く人が別々のこともありそうなのでデータをエクセルで管理できるようにしたい.

データ

f:id:zvn_X:20170108232547p:plain

キャラクターの名前とHP,SPEEDのみが格納されています。

コード

利用するクラス

  1. ReadCSV.cs

    csvファイルを読み込み、Dictionaryに値を格納していきます。また、そのデータを返す関数を一つ用意

  2. Monster.cs

    モンスターの挙動が代わることをチェックするクラス。

     1. monsterの移動スピードの変更
     1. HP,NAME,SPEEDをテクスチャとして表示
    
  3. MonsterManager

    Monsterを管理するクラス.

    1. モンスターの生成やcsvから生成
    1. monsterのパラメーターをmonsterにセットします
    

ReadCSV.cs

   Dictionary<string, Dictionary<string, string>> NameDic = new Dictionary<string, Dictionary<string, string>>();


    public ReadCSV(string test) {
        int csvNumberLines = 0;
        TextAsset csvFile = Resources.Load("CSV/"+test) as TextAsset;
        StringReader reader = new StringReader(csvFile.text);
        List<string[]> lisString = new List<string[]>();
        while (reader.Peek() > -1) {
            string line = reader.ReadLine();
            lisString.Add(line.Split(','));

            SetDictionary(csvNumberLines,lisString);
            csvNumberLines++;
        }

    }


    void SetDictionary(int csvNumberLines,List<string[]> lisString) {
        Dictionary<string, string> dic = new Dictionary<string, string>();
        var NAME = lisString[csvNumberLines][0];
        var HP = lisString[csvNumberLines][1];
        var SPEED = lisString[csvNumberLines][2];
        dic.Add(lisString[0][0], NAME);
        dic.Add(lisString[0][1], HP);
        dic.Add(lisString[0][2], SPEED);
        NameDic.Add(NAME, dic); 
    }


    //csvをDictionaryに変換したMonsterDataを返します
    public Dictionary<string,string> GetMonsterData(string monsterName) {
        var MonsterDic = NameDic[monsterName];
        return MonsterDic;
    }

Monster.cs

   float maxSpeed = 0.0f;
    float speed = 0.0f;

    void Update () {
        transform.Translate(new Vector3(speed/10, 0.0f, 0.0f));
    }

    public void SetStates(Dictionary<string,string> states){
        Debug.Log(states["HP"]);
        Debug.Log(states["SPEED"]);
        speed = float.Parse(states["SPEED"]);
        this.GetComponent<TextMesh>().text = states["NAME"]+"\nSPEED:"+states["SPEED"]+"\nHP:"+states["HP"];
    }

MonsterManager

public GameObject[] enemy;
    ReadCSV csv;
    float timeOut;
    float timeElapsed;


    void Awake() {
        timeOut = 5.0f;
        csv = new ReadCSV("test");
    }


    void Update() {
        timeElapsed += Time.deltaTime;

        if (timeElapsed >= timeOut) {
            Debug.Log("huga");
            GameObject monster = Instantiate(enemy[0], new Vector3(0.0f, 0.0f, 0.0f), new Quaternion(0.0f, 0.0f, 0.0f, 0.0f)) as GameObject;
            monster.GetComponent<Monster>().SetStates(csv.GetMonsterData("ELEPHANT"));

            monster = Instantiate(enemy[1], new Vector3(0.0f, 0.0f, 0.0f), new Quaternion(0.0f, 0.0f, 0.0f, 0.0f)) as GameObject;
            monster.GetComponent<Monster>().SetStates(csv.GetMonsterData("RABBIT"));

            timeElapsed = 0.0f;
        }
    }

コードの流れ

  1. MonsterManagerが読み取りたいcsvファイルを指定
  2. CSVファイルを読み込んでDicに格納
  3. MonsterManagerが取得したいMonsterDateを指定
  4. MonsterDateを元にMonsterを生成。

この記事は下記のサイトを参考にしています.

qiita.com