做完了以后我又想了一下,发现其实根本不需要这么麻烦,果然demo里的代码对我的思路影响还是有点大。demo里的c++代码为了展示地牢的墙壁,在二维数组中加上了wall这个东西表示墙壁。事实上用unity来做的话,只需要考虑地板的位置,然后根据邻接的地板有没有东西来判断是否生成墙壁即可。
首先用一个枚举类型代表地牢迷宫中的各个元素:
public enumTile
{
Default,
DirtFloor,//房间地板
Wall_w,//上方的墙
Wall_s,//下方的墙
Wall_a,//左方的墙
Wall_d,//右方的墙
Corridor_ad,//横向走廊
Corridor_ws,//纵向走廊
Door,//房门
UpStairs,//入口
DownStairs//出口
}
然后考虑使用二维数组来保存地牢元素的信息。既然是用unity来做,先不考虑随机地牢的逻辑数组要怎么生成,先把二维数组转化为实体的方法写出来:
建立一个test脚本,用于测试生成用的creat_dungeon方法是否好用,并在里面定义一个测试用的二维数组:
usingUnityEngine;usingSystem.Collections;usingSystem;public classtest : MonoBehaviour {voidStart () {
Action _Instantiate=(t,v)=>{Instantiate(t,v,t.rotation);};//这里考虑不当,理论上不应该在test脚本中写Instantiate方法,而是应该在creat_dungeon中用。不过既然写出来了也能显示我懂一些委托的知识...将错就错好了
Tile[,] _map=new Tile[4,4];
_map [0, 1] =Tile.Wall_s;
_map [0, 2] =Tile.Wall_s;
_map [1, 1] =Tile.DirtFloor;
_map [1, 2] =Tile.DirtFloor;
_map [2, 1] =Tile.DirtFloor;
_map [2, 2] =Tile.DirtFloor;
_map [3, 1] =Tile.Corridor_ws;
_map [3, 2] =Tile.Wall_w;
_map [1, 3] =Tile.Corridor_ad;
_map [2, 3] =Tile.Wall_d;
_map [1, 0] =Tile.Corridor_ad;
_map [2, 0] = Tile.Wall_a;//自定义一个地图
creat_dungeon.Instance.creat (_map,_Instantiate);//调用生成函数
}
接下去就是考虑怎么写creat_dungeon这个类了,首先这个类只用于生成实体,所以不应该存在多份,所以设计成单例:
public classcreat_dungeon{private staticcreat_dungeon _instance;privatecreat_dungeon(){}public staticcreat_dungeon Instance{get{if (_instance == null)
{
_instance= newcreat_dungeon ();
}return_instance;
}
}
}
然后这个类中肯定需要动态加载预设的资源,这里用resources.load方法加载,在初始化函数中加上加载资源的代码:
privateTransform floor,pillar,wall_ws,wall_ad;privatecreat_dungeon(){
floor= Resources.Load ("Floor_1_Prefab",typeof (Transform)) asTransform;
pillar= Resources.Load ("Pillar_1_Prefab",typeof (Transform))asTransform;
wall_ws= Resources.Load ("Wall_w", typeof(Transform))asTransform;
wall_ad= Resources.Load ("Wall_a", typeof(Transform))asTransform;
}
然后根据资源模型的大小,定义一个常量:
private float floor_length=1.518111f;<