見出し画像

【Unity】3Dローグライクゲームの作り方〜Step12-6〜

前回の記事はこちら
前回は階層移動を実装しました。

2Fのマップを作成する

今回は2Fのマップを作成する所から始めたいと思います。
マップデータファイルを開いて、新しいGroup Layerを作成し、名前を「1F」にします。その中に今まで使用していたレイヤーを全て入れましょう。
次は「2F」という名前の新しいGroup Layerを作成し、その中に「Tile Layer」と「Object Layer」という名前でそれぞれのレイヤーを作成します。
そして、そこに2Fのマップを書いていって下さい。
筆者は以下のようになりました。

スクリーンショット 2020-06-01 1.10.56

保存したら、ファイルの差し替えを忘れず行っておきましょう。

ReadMapFileメソッドの修正

読み込み処理を変えます。LoadFieldMap.ReadMapFileメソッドを以下のように書き換えて下さい。

private Array2D ReadMapFile(string path)
{
   try
   {
       XDocument xml = XDocument.Load(path);
       XElement map = xml.Element("map");
       XElement group = null;
       foreach (var gp in map.Elements("group"))
       {
           if (gp.Attribute("name").Value.Equals(Field.floorNum + "F"))
           {
               group = gp;
               break;
           }
       }
       if (group == null) return new Array2D(1, 1);
       Array2D data = null;
       int w = 0, h = 0;
       foreach (var layer in group.Elements("layer"))
       {
           switch (layer.Attribute("name").Value)
           {
               case "Tile Layer":
                   string[] sdata = (layer.Element("data").Value).Split(',');
                   w = int.Parse(layer.Attribute("width").Value);
                   h = int.Parse(layer.Attribute("height").Value);
                   data = new Array2D(w, h);
                   for (int z = 0; z < h; z++)
                   {
                       for (int x = 0; x < w; x++)
                       {
                           data.Set(x, z, int.Parse(sdata[ToMirrorX(x, w) + z * w]) - 1);
                       }
                   }
                   break;
           }
       }
       foreach (var objgp in group.Elements("objectgroup"))
       {
           switch (objgp.Attribute("name").Value)
           {
               case "Object Layer":
                   foreach (var obj in objgp.Elements("object"))
                   {
                       int x = int.Parse(obj.Attribute("x").Value);
                       int z = int.Parse(obj.Attribute("y").Value);
                       int pw = int.Parse(obj.Attribute("width").Value);
                       int ph = int.Parse(obj.Attribute("height").Value);
                       string name = obj.Attribute("name").Value;
                       string type = "";
                       foreach (var prop in obj.Element("properties").Elements("property"))
                       {
                           switch (prop.Attribute("name").Value)
                           {
                               case "Type":
                                   type = prop.Attribute("value").Value;
                                   break;
                           }
                       }
                       field.SetObject(name, type, ToMirrorX(x / pw, w), z / ph);
                   }
                   break;
           }
       }
       return data;
   }
   catch (System.Exception i_exception)
   {
       Debug.LogErrorFormat("{0}", i_exception);
   }
   return null;
}

グループレイヤーの名前に「階数+F」と一致するものがあればそれを読み込み、なければ適当なArray2Dを返しています。
テストしてみましょう。
次のように2Fに行くことができればOKです。

スクリーンショット 2020-06-01 1.19.14

今回は内容が少なめですが、ここまでにさせて下さい。
次回はダンジョンの自動生成のコードを書いていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?