Unity杀戮尖塔地图算法实现
一. 地图房间生成规则①房间数量规则②房间位置二. 路线生成规则①获取当前房间最近的上层房间②断路检索
·
Unity杀戮尖塔地图算法实现
效果展示
随机切换地图效果展示
实现思路
一. 地图房间生成规则
①房间数量规则
起点层:房间数量动态配置
中间层:房间数量 :{最小值:2 ,最大值起点数量*2-1}
boss 层:房间数量=1
②房间位置
X: 房间在该层平铺后+随机横向偏移
Y:当前层数 * 每层高度+随机纵向偏移
二. 路线生成规则
①获取当前房间最近的上层房间,将该房间存入当前房间上层对象列表中
②断路检索:如果下层房间没有任何对象将当前层设置到上层对象列表中,下层距离此层距离最近的对象将此层添加至上层对象列表
③链接当前层和上层对象列表中的对象
核心代码展示:
一. 地图房间生成规则
①地图管理类初始化层数据
//MapManager
public void InitData()
{
if (layerDic == null)
{
layerDic = new Dictionary<int, MaplayerItem>();
}
if (layerList == null)
{
layerList = new List<MaplayerItem>();
}
for (int i = 0; i < MaxLayer; i++)
{
MaplayerItem item = new MaplayerItem(i, entranceCount);
ELayerType eLayerType = i == 0 ? ELayerType.Start : i == MaxLayer - 1 ? ELayerType.End : ELayerType.Cent;
item.InitData(eLayerType, itemBase, rootObj);
layerDic.Add(i, item);
layerList.Add(item);
}
}
②层数据初始化地图房间数据
//MaplayerItem
public void InitData(ELayerType layerType, MapItemBase item, Transform rootObj)
{
int count = 0;
this.layerType = layerType;
switch (layerType)
{
case ELayerType.Start:
count = entranceCount;
break;
case ELayerType.Cent:
count = entranceCount + Random.Range(2 - entranceCount, entranceCount);
break;
case ELayerType.End:
count = 1;
break;
default:
break;
}
InitLayerDic(count, item, rootObj);
}
public void InitLayerDic(int Count, MapItemBase item, Transform rootObj)
{
if (MapItemDic == null)
{
MapItemDic = new Dictionary<int, MapItemBase>();
}
else
{
Clear();
}
for (int i = 0; i < Count; i++)
{
MapItemBase nowItem = MonoBehaviour.Instantiate(item, rootObj);
int xR = Random.Range(-xRandom, xRandom);
int yR = Random.Range(-yRandom, yRandom);
if (nowLayer == 0)
{
yR = 0;
}
float xPos = GetPosX(i, Count);
float addendPosY = ELayerType.End == layerType ? 70 : 0;
nowItem.transform.localPosition = new Vector3(xPos, nowLayer * ySize + yR+addendPosY, 0);
nowItem.RefreshUI(nowLayer + "_" + i, nowLayer);
MapItemDic.Add(i, nowItem);
}
}
private float GetPosX(int nowIndix, float Count)
{
float onePos = entranceMaxCount * xSize / (Count + 1);
float pos = (nowIndix + 1) * onePos;
int xR = Random.Range(-xRandom, xRandom);
return pos + xR;
}
二. 路线生成规则
①路线算法核心代码展示
/// <summary>
/// 刷新地图路径数据
/// </summary>
public void RefreshLineData()
{
if (layerList == null)
{
return;
}
int MaxCount = layerList.Count;
for (int i = 0; i < layerList.Count; i++)
{
//上层
MaplayerItem TopItem = i == MaxCount - 1 ? null : layerList[i + 1];
//当前层
MaplayerItem nowItem = layerList[i];
nowItem.RefreshTopLineData(TopItem == null ? null : TopItem.MapItemDic);
}
for (int i = 0; i < layerList.Count; i++)
{
//当前层
MaplayerItem nowItem = layerList[i];
////下层
MaplayerItem DownItem = i == 0 ? null : layerList[i - 1];
if (DownItem != null)
{
nowItem.TopLineAdditional(DownItem.MapItemDic);
}
}
}
/// <summary>
/// 刷新上层数据列表
/// </summary>
/// <param name="ComparelayerDic"></param>
public void RefreshTopLineData(Dictionary<int, MapItemBase> ComparelayerDic)
{
if (MapItemDic == null) { return; }
foreach (var item in MapItemDic)
{
MapItemBase nowItem = item.Value;
nowItem.TopItemList.Clear();
//获取距离此节点最近的对象
MapItemBase topItem= nowItem.GetNearestDistanceItem(ComparelayerDic);
if (topItem != null) {
topItem.DownItem = nowItem;
nowItem.TopItemList.Add(topItem);
}
}
}
/// <summary>
/// 断路检索
/// </summary>
/// <param name="ComparelayerDic"></param>
public void TopLineAdditional(Dictionary<int, MapItemBase> ComparelayerDic) {
if (MapItemDic == null) { return; }
foreach (var item in MapItemDic)
{
MapItemBase nowItem = item.Value;
if (nowItem.DownItem==null)
{
//获取距离此节点最近的对象
MapItemBase downItem = nowItem.GetNearestDistanceItem(ComparelayerDic);
if (downItem != null)
{
nowItem.DownItem = downItem;
downItem.TopItemList.Add(nowItem);
}
}
}
}
项目源码:
https://download.csdn.net/download/qq_33894287/89114692

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)