using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
#if Tool
[CustomEditor(typeof(MapMaker))]
public class MapTool : Editor
{
private MapMaker mapMaker;
private List<FileInfo> fileList = new List<FileInfo>();
private string[] fileNameList;
private int selectIndex = -1;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (Application.isPlaying)
{
#region 第一行
mapMaker = MapMaker.Instance;
EditorGUILayout.BeginHorizontal();
fileNameList = GetNames(fileList);
int currentIndex = EditorGUILayout.Popup(selectIndex, fileNameList);
if (currentIndex != selectIndex)
{
selectIndex = currentIndex;
mapMaker.InitMap();
mapMaker.LoadLevelFile(mapMaker.LoadLevelInfoFile(fileNameList[selectIndex]));
}
if (GUILayout.Button("读取关卡列表"))
{
LoadLevelFiles();
}
EditorGUILayout.EndHorizontal();
#endregion
#region 第二行
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("恢复地图编辑器默认状态"))
{
mapMaker.RecoverTowerPoint();
}
if (GUILayout.Button("清楚怪物路点"))
{
mapMaker.ClearMonsterPath();
}
EditorGUILayout.EndHorizontal();
#endregion
#region 第三行
if (GUILayout.Button("保存当前关卡数据文件"))
{
mapMaker.SaveLevelFileByJson();
}
#endregion
}
}
private void LoadLevelFiles()
{
ClearList();
fileList = GetLevelFiles();
}
private void ClearList()
{
fileList.Clear();
selectIndex = -1;
}
private List<FileInfo> GetLevelFiles()
{
string[] files = Directory.GetFiles(Application.dataPath + "/Resources/Json/Level/","*.json");
List<FileInfo> list = new List<FileInfo>();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = new FileInfo(files[i]);
list.Add(file);
}
return list;
}
private string[] GetNames(List<FileInfo> files)
{
List<string> names = new List<string>();
foreach (FileInfo file in files)
{
names.Add(file.Name);
}
return names.ToArray();
}
}
#endif
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.EventSystems;
public class GridPoint : MonoBehaviour
{
private SpriteRenderer spriteRenderer;
private Sprite gridSprite;
public GridState gridState;
public GridIndex gridIndex;
public bool hasTower;
private Sprite startSprite;
private Sprite coutBuildSprite;
private GameControl gameControl;
private GameObject towerListGo;
private GameObject handleTowerCanvasGo;
private Transform upLevelBtnTrans;
private Transform sellTowerBtnTrans;
private Vector3 upLevelBtnInitPos;
private Vector3 sellTowerBtnInitPos;
#if Tool
private Sprite monsterPathSprite;
public GameObject[] itemPrefabs;
public GameObject currentItem;
#endif
[SerializeField]
public struct GridState
{
public bool canBuild;
public bool isMonsterPoint;
public bool hasItem;
public int itemID;
}
[SerializeField]
public struct GridIndex
{
public int xIndex;
public int yIndex;
}
private void Awake()
{
#if Tool
gridSprite = Resources.Load<Sprite>("Pictures/NormalMordel/Game/Grid");
monsterPathSprite = Resources.Load<Sprite>("Pictures/NormalMordel/Game/1/Monster/6-1");
itemPrefabs = new GameObject[10];
string PrefabsPath = "Prefabs/Game/" + MapMaker.Instance.bigLevelID.ToString() + "/Item/";
for (int i = 0; i < itemPrefabs.Length; i++)
{
itemPrefabs[i] = Resources.Load<GameObject>(PrefabsPath + i);
if (!itemPrefabs[i])
{
Debug.Log("加载失败、失败路径" + PrefabsPath + i);
}
}
#endif
spriteRenderer = GetComponent<SpriteRenderer>();
InitGrid();
#if Game
gameControl = GameControl.Instance;
gridSprite = gameControl.GetSprite("NormalMordel/Game/Grid");
startSprite = gameControl.GetSprite("NormalMordel/Game/StartSprite");
coutBuildSprite = gameControl.GetSprite("NormalMordel/Game/cantBuild");
spriteRenderer.sprite = startSprite;
Tween t = DOTween.To(() => spriteRenderer.color, tocolor => spriteRenderer.color = tocolor, new Color(1, 1, 1, 0.2f), 3f);
t.OnComplete(ChangeSpriteToGrid);
towerListGo = gameControl.towerListGo;
handleTowerCanvasGo = gameControl.handleTowerCanvasGo;
upLevelBtnTrans = handleTowerCanvasGo.transform.Find("Btn_UpLevel");
sellTowerBtnTrans = handleTowerCanvasGo.transform.Find("Btn_SellTower");
upLevelBtnInitPos = upLevelBtnTrans.localPosition;
sellTowerBtnInitPos = sellTowerBtnTrans.localPosition;
#endif
}
private void ChangeSpriteToGrid()
{
spriteRenderer.enabled = false;
spriteRenderer.color = new Color(1, 1, 1, 1);
if (gridState.canBuild)
{
spriteRenderer.sprite = gridSprite;
}
else
{
spriteRenderer.sprite = coutBuildSprite;
}
}
public void InitGrid()
{
gridState.canBuild = true;
gridState.isMonsterPoint = false;
gridState.hasItem = false;
spriteRenderer.enabled = true;
gridState.itemID = -1;
#if Tool
spriteRenderer.sprite = gridSprite;
Destroy(currentItem);
#endif
}
#if Game
public void UpdateGrid()
{
if (gridState.canBuild)
{
spriteRenderer.enabled = true;
if (gridState.hasItem)
{
CreateItem();
}
}
else
{
spriteRenderer.enabled = false;
}
}
private void CreateItem()
{
GameObject itemGo = GameControl.Instance.GetGameObjectResource(GameControl.Instance.mapMaker.bigLevelID.ToString() + "/Item/" + gridState.itemID);
itemGo.transform.SetParent(GameControl.Instance.transform);
Vector3 createPos = transform.position - new Vector3(0, 0, 3);
if (gridState.itemID <= 2)
{
createPos += new Vector3(GameControl.Instance.mapMaker.gridWidth, -GameControl.Instance.mapMaker.gridHeight) / 2;
}
else if (gridState.itemID <= 4)
{
createPos += new Vector3(GameControl.Instance.mapMaker.gridWidth, 0) / 2;
}
itemGo.transform.position = createPos;
itemGo.GetComponent<Item>().gridPoint = this;
}
private void OnMouseDown()
{
Debug.Log("鼠标点击事件");
gameControl.HandleGrid(this);
}
public void AfterBuild()
{
spriteRenderer.enabled = false;
Debug.Log("隐藏");
}
public void ShowGird()
{
if (!hasTower)
{
spriteRenderer.enabled = true;
towerListGo.transform.position = CorrectTowerListGoPosition();
towerListGo.SetActive(true);
}
else
{
handleTowerCanvasGo.transform.position = transform.position;
CorrectHandleTowerCanvasGoPosition();
handleTowerCanvasGo.SetActive(true);
}
}
public void HideGrid()
{
if (!hasTower)
{
towerListGo.SetActive(false);
}
else
{
handleTowerCanvasGo.SetActive(false);
}
spriteRenderer.enabled = false;
}
public void ShowCantBuild()
{
spriteRenderer.enabled = true;
Tween t = DOTween.To(() => spriteRenderer.color, tocolor => spriteRenderer.color = tocolor, new Color(1, 1, 1, 0), 2f);
t.OnComplete
(() =>
{
spriteRenderer.enabled = false;
spriteRenderer.color = new Color(1, 1, 1, 1);
}
);
}
private Vector3 CorrectTowerListGoPosition()
{
Vector3 createPositon = Vector3.zero;
if (gridIndex.xIndex <= 3 && gridIndex.xIndex >= 0)
{
createPositon += new Vector3(gameControl.mapMaker.gridWidth, 0, 0);
}
else if (gridIndex.xIndex <= 11 && gridIndex.xIndex >= 8)
{
createPositon -= new Vector3(gameControl.mapMaker.gridWidth, 0, 0);
}
if (gridIndex.yIndex <= 3 && gridIndex.yIndex >= 0)
{
createPositon += new Vector3(0, gameControl.mapMaker.gridHeight, 0);
}
else if (gridIndex.yIndex <= 7 && gridIndex.yIndex >= 4)
{
createPositon -= new Vector3(0, gameControl.mapMaker.gridHeight, 0);
}
createPositon += transform.position;
return createPositon;
}
private void CorrectHandleTowerCanvasGoPosition()
{
upLevelBtnTrans.localPosition = Vector3.zero;
sellTowerBtnTrans.localPosition = Vector3.zero;
if (gridIndex.yIndex <= 0)
{
if (gridIndex.xIndex == 0)
{
sellTowerBtnTrans.position += new Vector3(gameControl.mapMaker.gridWidth * 3 / 4, 0, 0);
}
else
{
sellTowerBtnTrans.position -= new Vector3(gameControl.mapMaker.gridWidth * 3 / 4, 0, 0);
}
upLevelBtnTrans.localPosition = upLevelBtnInitPos;
}
else if (gridIndex.yIndex >= 6)
{
if (gridIndex.xIndex == 0)
{
upLevelBtnTrans.position += new Vector3(gameControl.mapMaker.gridWidth * 3 / 4, 0, 0);
}
else
{
upLevelBtnTrans.position -= new Vector3(gameControl.mapMaker.gridWidth * 3 / 4, 0, 0);
}
sellTowerBtnTrans.localPosition = sellTowerBtnInitPos;
}
else
{
upLevelBtnTrans.localPosition = upLevelBtnInitPos;
sellTowerBtnTrans.localPosition = sellTowerBtnInitPos;
}
}
#endif
#if Tool
private void OnMouseDown()
{
if (Input.GetKey(KeyCode.P))
{
gridState.canBuild = false;
spriteRenderer.enabled = true;
gridState.isMonsterPoint = !gridState.isMonsterPoint;
if (gridState.isMonsterPoint)
{
MapMaker.Instance.monsterPath.Add(gridIndex);
spriteRenderer.sprite = monsterPathSprite;
}
else
{
MapMaker.Instance.monsterPath.Remove(gridIndex);
spriteRenderer.sprite = gridSprite;
gridState.canBuild = true;
}
}
else if(Input.GetKey(KeyCode.I))
{
gridState.itemID++;
if (gridState.itemID == itemPrefabs.Length)
{
gridState.itemID = -1;
Destroy(currentItem);
gridState.hasItem = false;
return;
}
if (currentItem == null)
{
CreateItem();
}
else
{
Destroy(currentItem);
CreateItem();
}
gridState.hasItem = true;
}
else if (!gridState.isMonsterPoint)
{
gridState.isMonsterPoint = false;
gridState.canBuild = !gridState.canBuild;
if (gridState.canBuild)
{
spriteRenderer.enabled= true;
}
else
{
spriteRenderer.enabled = false;
}
}
}
private void CreateItem()
{
Vector3 createPos = transform.position;
if (gridState.itemID <= 2)
{
createPos += new Vector3(MapMaker.Instance.gridWidth, -MapMaker.Instance.gridHeight) / 2;
}
else if (gridState.itemID <= 4)
{
createPos += new Vector3(MapMaker.Instance.gridWidth,0) / 2;
}
GameObject itemGo = Instantiate(itemPrefabs[gridState.itemID], createPos, Quaternion.identity);
currentItem = itemGo;
}
public void UpdateGrid()
{
if (gridState.canBuild)
{
spriteRenderer.sprite = gridSprite;
spriteRenderer.enabled = true;
if (gridState.hasItem)
{
CreateItem();
}
}
else
{
if (gridState.isMonsterPoint)
{
spriteRenderer.sprite = monsterPathSprite;
}
else
{
spriteRenderer.enabled = false;
}
}
}
#endif
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Level
{
public int totalRound;
public Round[] roundList;
public int currentRound;
public Level(int roundNum, List<Round.RoundInfo> roundInfoList)
{
totalRound = roundNum;
roundList = new Round[totalRound];
for (int i = 0; i < totalRound; i++)
{
roundList[i] = new Round(roundInfoList[i].mMonsterIDList, i, this);
}
for (int i = 0; i < totalRound; i++)
{
if (i == totalRound - 1)
{
break;
}
roundList[i].SetNextRound(roundList[i + 1]);
}
}
public void HandleRound()
{
if (currentRound >= totalRound)
{
}
else if (currentRound == totalRound-1)
{
}
else
{
roundList[currentRound].Handle(currentRound);
}
}
public void HandleLastRound()
{
roundList[currentRound].Handle(currentRound);
}
public void AddRoundNum()
{
currentRound++;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LevelInfo
{
public int bigLevelID;
public int levelID;
public List<GridPoint.GridState> gridPoints;
public List<GridPoint.GridIndex> monsterPath;
public List<Round.RoundInfo> roundInfo;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;
public class MapMaker : MonoBehaviour
{
#if Tool
public bool drawLine;
public GameObject gridGo;
private static MapMaker _instance;
public static MapMaker Instance
{
get
{
return _instance;
}
}
#endif
private float mapWidth;
private float mapHeight;
[HideInInspector]
public float gridWidth;
[HideInInspector]
public float gridHeight;
[HideInInspector]
public int bigLevelID;
[HideInInspector]
public int LevelID;
public GridPoint[,] gridPoints;
public const int yRow = 8;
public const int xColumn = 12;
[HideInInspector]
public List<Vector3> monsterPathPos;
private SpriteRenderer bgSR;
private SpriteRenderer roadSR;
[HideInInspector]
public List<GridPoint.GridIndex> monsterPath;
public List<Round.RoundInfo> roundInfoList;
[HideInInspector]
public Carrot carrot;
private void Awake()
{
#if Tool
_instance = this;
#endif
}
public void InitMapMaker()
{
CalculateSize();
gridPoints = new GridPoint[xColumn, yRow];
monsterPath = new List<GridPoint.GridIndex>();
for (int x = 0; x < xColumn; x++)
{
for (int y = 0; y < yRow; y++)
{
#if Tool
GameObject itemGo = Instantiate(gridGo, transform.position, transform.rotation);
#endif
#if Game
GameObject itemGo = GameControl.Instance.GetGameObjectResource("Grid");
#endif
itemGo.transform.position = CorretPositon(x * gridWidth, y * gridHeight);
itemGo.transform.SetParent(transform);
gridPoints[x, y] = itemGo.GetComponent<GridPoint>();
gridPoints[x, y].gridIndex.xIndex = x;
gridPoints[x, y].gridIndex.xIndex = y;
}
}
bgSR = transform.Find("BG").GetComponent<SpriteRenderer>();
roadSR = transform.Find("Road").GetComponent<SpriteRenderer>();
}
#if Game
public void LoadMap(int bigLevel,int Level)
{
bigLevelID = bigLevel;
LevelID = Level;
LoadLevelFile(LoadLevelInfoFile("Level" + bigLevelID.ToString() + "_" + LevelID.ToString() + ".json"));
monsterPathPos = new List<Vector3>();
for (int i = 0; i < monsterPath.Count; i++)
{
monsterPathPos.Add(gridPoints[monsterPath[i].xIndex,monsterPath[i].yIndex].transform.position);
}
GameObject startPointGo = GameControl.Instance.GetGameObjectResource("startPoint");
startPointGo.transform.position = monsterPathPos[0];
startPointGo.transform.SetParent(transform);
GameObject endPointGo = GameControl.Instance.GetGameObjectResource("Carrot");
endPointGo.transform.position = monsterPathPos[monsterPathPos.Count - 1];
endPointGo.transform.SetParent(transform);
carrot = endPointGo.GetComponent<Carrot>();
}
#endif
public Vector3 CorretPositon(float x,float y)
{
return new Vector3(x - mapWidth / 2 + gridWidth / 2, y- mapHeight / 2 + gridHeight / 2);
}
private void CalculateSize()
{
Vector3 leftDown = new Vector3(0, 0);
Vector3 rightUp = new Vector3(1, 1);
Vector3 posOne = Camera.main.ViewportToWorldPoint(leftDown);
Vector3 posTwo = Camera.main.ViewportToWorldPoint(rightUp);
mapWidth = posTwo.x - posOne.x;
mapHeight = posTwo.y - posOne.y;
gridWidth = mapWidth / xColumn;
gridHeight = mapHeight / yRow;
}
#if Tool
private void OnDrawGizmos()
{
if (drawLine)
{
CalculateSize();
Gizmos.color = Color.green;
for (int y = 0; y <= yRow; y++)
{
Vector3 startPos = new Vector3(-mapWidth / 2, -mapHeight / 2 + y * gridHeight);
Vector3 endPos = new Vector3(mapWidth / 2, -mapHeight / 2 + y * gridHeight);
Gizmos.DrawLine(startPos, endPos);
}
for (int x = 0; x <= xColumn; x++)
{
Vector3 startPos = new Vector3(-mapWidth / 2 + gridWidth * x, mapHeight / 2);
Vector3 endPos = new Vector3(-mapWidth / 2 + x * gridWidth, -mapHeight / 2);
Gizmos.DrawLine(startPos, endPos);
}
}
else
{
return;
}
}
#endif
public void ClearMonsterPath()
{
monsterPath.Clear();
}
public void RecoverTowerPoint()
{
ClearMonsterPath();
for (int x = 0; x < xColumn; x++)
{
for (int y = 0; y < yRow; y++)
{
gridPoints[x, y].InitGrid();
}
}
}
public void InitMap()
{
bigLevelID = 0;
LevelID = 0;
RecoverTowerPoint();
roundInfoList.Clear();
bgSR.sprite = null;
roadSR.sprite = null;
}
#if Tool
private LevelInfo CreateLevelInfoGo()
{
LevelInfo levelInfo = new LevelInfo()
{
bigLevelID = this.bigLevelID,
levelID = this.LevelID,
};
levelInfo.gridPoints = new List<GridPoint.GridState>();
for (int x = 0; x < xColumn; x++)
{
for (int y = 0; y < yRow; y++)
{
levelInfo.gridPoints.Add(gridPoints[x, y].gridState);
}
}
levelInfo.monsterPath = new List<GridPoint.GridIndex>();
for (int i = 0; i < monsterPath.Count; i++)
{
levelInfo.monsterPath.Add(monsterPath[i]);
}
levelInfo.roundInfo = new List<Round.RoundInfo>();
for (int i = 0; i < roundInfoList.Count; i++)
{
levelInfo.roundInfo.Add(roundInfoList[i]);
}
Debug.Log("保存成功");
return levelInfo;
}
public void SaveLevelFileByJson()
{
LevelInfo levelInfoGo = CreateLevelInfoGo();
string filePath = Application.dataPath + "/Resources/Json/Level/" + bigLevelID.ToString() + "_" + LevelID.ToString() + ".json";
string saveJsonStr = JsonMapper.ToJson(levelInfoGo);
StreamWriter sw = new StreamWriter(filePath);
sw.Write(saveJsonStr);
sw.Close();
}
#endif
public LevelInfo LoadLevelInfoFile(string fileName)
{
LevelInfo levelInfo = new LevelInfo();
string filePath = Application.dataPath + "/Resources/Json/Level/" + fileName;
if (File.Exists(filePath))
{
StreamReader sr = new StreamReader(filePath);
string jsonStr = sr.ReadToEnd();
sr.Close();
levelInfo = JsonMapper.ToObject<LevelInfo>(jsonStr);
return levelInfo;
}
Debug.Log("文件加载失败、失败路径"+filePath);
return null;
}
public void LoadLevelFile(LevelInfo levelInfo)
{
bigLevelID = levelInfo.bigLevelID;
LevelID = levelInfo.levelID;
for (int x = 0; x < xColumn; x++)
{
for (int y = 0; y < yRow; y++)
{
gridPoints[x, y].gridState = levelInfo.gridPoints[y + x * yRow];
gridPoints[x, y].UpdateGrid();
}
}
monsterPath.Clear();
for (int i = 0; i < levelInfo.monsterPath.Count; i++)
{
monsterPath.Add(levelInfo.monsterPath[i]);
}
roundInfoList = new List<Round.RoundInfo>();
for (int i = 0; i < levelInfo.roundInfo.Count; i++)
{
roundInfoList.Add(levelInfo.roundInfo[i]);
}
bgSR.sprite = Resources.Load<Sprite>("Pictures/NormalMordel/Game/" + bigLevelID.ToString() + "/" + "BG" + (LevelID / 3).ToString());
roadSR.sprite = Resources.Load<Sprite>("Pictures/NormalMordel/Game/" + bigLevelID.ToString() + "/" + "Road" + LevelID);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Round
{
[Serializable]
public struct RoundInfo
{
public int[] mMonsterIDList;
}
public RoundInfo roundInfo;
protected Round mNextRound;
protected int mRoundID;
protected Level mlevel;
public Round(int[] monsterIDList, int roundID, Level level)
{
mlevel = level;
roundInfo.mMonsterIDList = monsterIDList;
mRoundID = roundID;
}
public void SetNextRound(Round nextRound)
{
mNextRound = nextRound;
}
public void Handle(int roundID)
{
if (mRoundID < roundID)
{
mNextRound.Handle(roundID);
}
else
{
GameControl.Instance.mMonsterIDList = roundInfo.mMonsterIDList;
GameControl.Instance.CreateMonster();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Stage
{
public int[] mTowerIDList;
public int mTowerIDListLength;
public bool mAllClear;
public int mCarrotState;
public int mLevelID;
public int mBigLevelID;
public bool unLocked;
public bool mIsRewardLevel;
public int mTotalRound;
public Stage(int totalRound, int towerIDListLength, int[] towerIDList,
bool allClear, int carrotState, int levelID, int bigLevelID, bool locked, bool isRewardLevel)
{
mTotalRound = totalRound;
mTowerIDListLength = towerIDListLength;
mTowerIDList = towerIDList;
mAllClear = allClear;
mCarrotState = carrotState;
mLevelID = levelID;
mBigLevelID = bigLevelID;
unLocked = locked;
mIsRewardLevel = isRewardLevel;
}
}