|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using UnityEngine; |
|
|
|
using UnityEngine.UI; |
|
|
|
using static LevelDevelopManager; |
|
|
|
|
|
|
|
public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
{ |
|
|
|
@ -23,6 +24,8 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
|
|
|
|
[Header("生成路线数量")] |
|
|
|
public int pathAmount; |
|
|
|
//生成路线节点结果(自动生成)
|
|
|
|
public List<List<int>> pathMap = new List<List<int>>();//关卡列表
|
|
|
|
|
|
|
|
[Header("节点生成权重")] |
|
|
|
public int mosterWight; |
|
|
|
@ -43,8 +46,16 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
private void Start() |
|
|
|
{ |
|
|
|
originalPoint= generatorPoint.transform.position; |
|
|
|
|
|
|
|
if(LevelDevelopManager .Instance .levelDevelopData .levelStep ==0) |
|
|
|
{ |
|
|
|
GenerateLevelMap(generatorLine, generatorColumn); |
|
|
|
//存储保存数据
|
|
|
|
SaveDataLoader(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
GeneratorLevelMapFormSave(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
public void GenerateLevelMap(int generatorLine, int generatorColumn) |
|
|
|
@ -55,6 +66,7 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
ShowMap(); |
|
|
|
RandomSetUpRoom(); |
|
|
|
CheckNodeRule(); |
|
|
|
CheckEliteMonster(); |
|
|
|
} |
|
|
|
//生成网格
|
|
|
|
public void GenerateGridMap( int generatorLine,int generatorColumn) |
|
|
|
@ -72,7 +84,11 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
var level = Instantiate(levelPrefab, generatorPoint.transform.position, levelPrefab.transform.rotation); |
|
|
|
level.transform.SetParent(LevelDevelopManager.Instance.levelFather.transform); |
|
|
|
level.transform.localScale = new Vector3(2, 2, 2); |
|
|
|
LevelDevelopManager.Instance.levelMap[i].levelColumn.Add(level.GetComponent<LevelNode>()); |
|
|
|
|
|
|
|
LevelNode bossLevelNode = level.GetComponent<LevelNode>(); |
|
|
|
bossLevelNode.line = i; |
|
|
|
bossLevelNode.column = j; |
|
|
|
LevelDevelopManager.Instance.levelMap[i].levelColumn.Add(bossLevelNode); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
@ -82,7 +98,7 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
{ |
|
|
|
generatorPoint.transform.position = new Vector3(generatorPoint.transform.position.x + lineOffset, generatorPoint.transform.position.y, 80); |
|
|
|
|
|
|
|
GenerateLevelNode(i,j); |
|
|
|
GenerateLevelNode(i,j, generatorPoint.transform.position); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -126,6 +142,10 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
int currentColum = column; |
|
|
|
LevelDevelopManager.Instance.levelMap[0].levelColumn[currentColum].isUse=true; |
|
|
|
|
|
|
|
//生成路线表
|
|
|
|
List<int> path = new List<int>(); |
|
|
|
path.Add(LevelDevelopManager.Instance.levelMap[0].levelColumn[currentColum].column );//加入起点
|
|
|
|
|
|
|
|
for (int line = 1; line < generatorLine; line++) |
|
|
|
{ |
|
|
|
if (line == generatorLine - 1) |
|
|
|
@ -152,12 +172,17 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
if (!nextLevelNode.fatherLevelNodes.Contains(LevelNode)) |
|
|
|
nextLevelNode.fatherLevelNodes.Add(LevelNode); |
|
|
|
nextLevelNode.isUse = true; |
|
|
|
|
|
|
|
//加入路线表
|
|
|
|
path.Add(nextLevelNode.column); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
pathMap .Add(path); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -236,15 +261,82 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//检查保底精英怪
|
|
|
|
public void CheckEliteMonster() |
|
|
|
{ |
|
|
|
for (int i = 0; i < pathMap.Count ; i++) |
|
|
|
{ |
|
|
|
bool haveEliteMonster = false; |
|
|
|
for (int j = 0; j < pathMap [i].Count ; j++) |
|
|
|
{ |
|
|
|
Debug.Log("路线"+i+":"+j + ";" + pathMap[i][j]); |
|
|
|
LevelNode currendLevelNode = LevelDevelopManager.Instance.levelMap[j].levelColumn[pathMap[i][j]]; |
|
|
|
if (currendLevelNode.roomType == LevelDevelopManager.RoomType.eliteMonster) |
|
|
|
{ |
|
|
|
haveEliteMonster = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
if(haveEliteMonster == false ) |
|
|
|
{ |
|
|
|
List<LevelNode> mosterNodes = new List<LevelNode>(); |
|
|
|
for (int j = 4; j < pathMap[i].Count; j++) |
|
|
|
{ |
|
|
|
|
|
|
|
LevelNode currendLevelNode = LevelDevelopManager.Instance.levelMap[j].levelColumn[pathMap[i][j]]; |
|
|
|
if (currendLevelNode.roomType == LevelDevelopManager.RoomType.monster) |
|
|
|
{ |
|
|
|
mosterNodes.Add(currendLevelNode); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
int index_m = Random.Range(0, mosterNodes.Count); |
|
|
|
bool haveRepeat = false; |
|
|
|
|
|
|
|
if (mosterNodes.Count >0) |
|
|
|
{ |
|
|
|
//判断变成精英后岔路目的地不重复,否则不变
|
|
|
|
foreach (var fatherRoom in mosterNodes[index_m].fatherLevelNodes) |
|
|
|
{ |
|
|
|
for (int x = 0; x < fatherRoom.nextLevelNodes.Count; x++) |
|
|
|
{ |
|
|
|
if (fatherRoom.nextLevelNodes[x].roomType == LevelDevelopManager.RoomType.eliteMonster) |
|
|
|
{ |
|
|
|
haveRepeat = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (haveRepeat == false) |
|
|
|
{ |
|
|
|
mosterNodes[index_m].SetUpRoom(LevelDevelopManager.RoomType.eliteMonster); |
|
|
|
Debug.Log("变成精英" + mosterNodes[index_m].line + ";" + mosterNodes[index_m].column); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Debug.Log("有重复" + mosterNodes[index_m].line + ";" + mosterNodes[index_m].column); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
//生成房间
|
|
|
|
public void GenerateLevelNode(int line ,int column) |
|
|
|
public LevelNode GenerateLevelNode(int line ,int column ,Vector3 pos) |
|
|
|
{ |
|
|
|
var level = Instantiate(levelPrefab, generatorPoint.transform.position, levelPrefab.transform.rotation); |
|
|
|
var level = Instantiate(levelPrefab, pos, levelPrefab.transform.rotation); |
|
|
|
level.transform.SetParent(LevelDevelopManager.Instance.levelFather.transform); |
|
|
|
LevelNode levelNode = level.GetComponent<LevelNode>(); |
|
|
|
levelNode.line = line; |
|
|
|
levelNode.column = column; |
|
|
|
LevelDevelopManager.Instance.levelMap[line].levelColumn.Add(levelNode); |
|
|
|
|
|
|
|
return levelNode; |
|
|
|
} |
|
|
|
|
|
|
|
//按规则随机设定房间
|
|
|
|
@ -303,10 +395,13 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
|
|
|
|
break; |
|
|
|
case LevelDevelopManager.RoomType.eliteMonster: |
|
|
|
if (i < 5) |
|
|
|
foreach (var fatherRoom in currentLevelNode.fatherLevelNodes) |
|
|
|
{ |
|
|
|
if (fatherRoom.roomType == LevelDevelopManager.RoomType.eliteMonster || i < 5) |
|
|
|
{ |
|
|
|
contravenes = true; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case LevelDevelopManager.RoomType.incident: |
|
|
|
|
|
|
|
@ -366,10 +461,13 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
|
|
|
|
break; |
|
|
|
case LevelDevelopManager.RoomType.eliteMonster: |
|
|
|
if (line < 5) |
|
|
|
foreach (var fatherRoom in currentLevelNode.fatherLevelNodes) |
|
|
|
{ |
|
|
|
if (fatherRoom.roomType == LevelDevelopManager.RoomType.eliteMonster || line < 5) |
|
|
|
{ |
|
|
|
contravenes = true; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case LevelDevelopManager.RoomType.incident: |
|
|
|
|
|
|
|
@ -480,8 +578,65 @@ public class LevelGenerator : Singleton<LevelGenerator> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//载入保存数据
|
|
|
|
public void SaveDataLoader() |
|
|
|
{ |
|
|
|
for (int i = 0; i < LevelDevelopManager.Instance.levelMap.Count; i++) |
|
|
|
{ |
|
|
|
LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList.Clear(); |
|
|
|
for (int j = 0; j < LevelDevelopManager.Instance.levelMap[i].levelColumn.Count; j++) |
|
|
|
{ |
|
|
|
LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList.Add(LevelDevelopManager.Instance.levelMap[i].levelColumn[j].ReturnSaveData()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//根据保存的信息生成地图
|
|
|
|
public void GeneratorLevelMapFormSave() |
|
|
|
{ |
|
|
|
for (int i = 0; i < LevelDevelopManager .Instance . levelDevelopData.levelSaveMap.Count; i++) |
|
|
|
{ |
|
|
|
for (int j = 0; j < LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList.Count; j++) |
|
|
|
{ |
|
|
|
LevelDevelopData_SO.levelData currentLevelData = LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList[j]; |
|
|
|
|
|
|
|
if (i == generatorLine - 1) |
|
|
|
{ |
|
|
|
LevelNode currentNode = GenerateLevelNode(i, j, currentLevelData.nodePos); |
|
|
|
currentNode.gameObject.transform.localScale = new Vector3(2, 2, 2); |
|
|
|
currentNode.SetUpRoomWithRoomData(currentLevelData); |
|
|
|
|
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LevelNode currentNode = GenerateLevelNode(i, j,currentLevelData .nodePos ); |
|
|
|
currentNode.SetUpRoomWithRoomData(currentLevelData); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < LevelDevelopManager.Instance.levelDevelopData.levelSaveMap.Count; i++) |
|
|
|
{ |
|
|
|
for (int j = 0; j < LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList.Count; j++) |
|
|
|
{ |
|
|
|
LevelDevelopData_SO.levelData currentLevelData = LevelDevelopManager.Instance.levelDevelopData.levelSaveMap[i].levelDataList[j]; |
|
|
|
LevelNode currentLevelNode = LevelDevelopManager.Instance.levelMap[i].levelColumn[j]; |
|
|
|
currentLevelNode.SetUpRoomLinkWithRoomData(currentLevelData); |
|
|
|
|
|
|
|
if (currentLevelNode.isUse==false ) |
|
|
|
{ |
|
|
|
currentLevelNode.gameObject.SetActive(false); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
currentLevelNode.LineShow(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|