XML关卡文件制定

我们的场景有如下元素:

  • Player
  • Enemy
  • Ground
  • NextLevel

如果我们想用文件描述场景中的元素,我们先要记录的就是它们的位置和名称信息。

先确定一个XML元素,并使用Level作为根节点,如下

1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<Level>
<LevelItem name="Player" x="0" y="0">
</Level>

在Project窗口的Assets文件夹下创建LevelFile文件夹,在其中新建一个xml文件,命名为LevelFileTest

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8" ?>
<Level>
<LevelItem name="Player" x="0" y="0"/>
<LevelItem name="Enemy" x="2" y="0"/>
<LevelItem name="NextLevel" x="4" y="0"/>
<LevelItem name="Ground" x="0" y="-1"/>
<LevelItem name="Ground" x="1" y="-1"/>
<LevelItem name="Ground" x="2" y="-1"/>
<LevelItem name="Ground" x="3" y="-1"/>
<LevelItem name="Ground" x="4" y="-1"/>
</Level>

Scene创建和预先准备

新建一个Scene,命名为LevelPlayer,并在场景中创建一个空对象,也叫LevelPlayer,注意位置重置一下。

回到SampleScene,在Project窗口中的Assets文件夹内新建Resources文件夹,将“Player”、“Enemy”、“Ground”、“NextLevel”都拖拽进去做成Prefab

修改“Ground”的Prefab缩放值为初始值,场景中的Ground跟着缩小的话单独修改场景中的缩放值即可

Prefab创建

解析脚本创建

进入Level Player场景中

在ViewController文件夹中新建一个文件夹,命名为LevelEditor,在其中新建一个脚本,命名为LevelPlayer,挂载在LevelPlayer上,把我们之前创建的LevelFIleTest文件放进引用里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Xml;
using UnityEngine;

namespace ShootingEditor2D
{
public class LevelPlayer : MonoBehaviour
{
public TextAsset levelFile;
void Start()
{
var xml = levelFile.text;
var document = new XmlDocument();
document.LoadXml(xml);

var levelNode = document.SelectSingleNode("Level");

foreach (XmlElement levelItemNode in levelNode.ChildNodes)
{
var ItemArrtibutes = levelItemNode.Attributes;
var levelItemName = ItemArrtibutes["name"].Value;
var levelItemX = int.Parse(ItemArrtibutes["x"].Value);
var levelItemY = int.Parse(ItemArrtibutes["y"].Value);

var levelItemPrefab = Resources.Load<GameObject>(levelItemName);
var levelItemGameobject = Instantiate(levelItemPrefab, transform);
levelItemGameobject.transform.position = new Vector3(levelItemX, levelItemY, 0);
}
}

}
}

这个脚本没有使用int.TryParse,也没有对生成位置做父子级关系的转换,非常简化,仅供参考

生成