【Unity】3Dローグライクゲームの作り方〜Step12-6〜
前回の記事はこちら。
前回は階層移動を実装しました。
2Fのマップを作成する
今回は2Fのマップを作成する所から始めたいと思います。
マップデータファイルを開いて、新しいGroup Layerを作成し、名前を「1F」にします。その中に今まで使用していたレイヤーを全て入れましょう。
次は「2F」という名前の新しいGroup Layerを作成し、その中に「Tile Layer」と「Object Layer」という名前でそれぞれのレイヤーを作成します。
そして、そこに2Fのマップを書いていって下さい。
筆者は以下のようになりました。
保存したら、ファイルの差し替えを忘れず行っておきましょう。
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です。
今回は内容が少なめですが、ここまでにさせて下さい。
次回はダンジョンの自動生成のコードを書いていきたいと思います。
この記事が気に入ったらサポートをしてみませんか?