Unity杀戮尖塔地图算法实现

效果展示
效果展示
随机切换地图效果展示
随机切换地图效果展示

实现思路

![[Pasted image 20240409204926.png]]

一. 地图房间生成规则

①房间数量规则
起点层:房间数量动态配置
中间层:房间数量 :{最小值: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

Logo

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

更多推荐