```csharp
2 [System.Serializable]
3 public class Wave
4 {
5 public GameObject enemyPrefab;
6 public int count;
7 public float rate;
8 }
1 public class EnemySpawner : MonoBehaviour {
2 public Wave[] waves;
3 public Transform start;
4 public int waveRate = 3;
5 public static int countEnemyAlive = 0;
6
7
8 void Start () {
9 StartCoroutine(SpawnEnemy());
10 }
11
12 IEnumerator SpawnEnemy()
13 {
14 foreach(Wave wave in waves)
15 {
16 for (int i = 0; i < wave.count; ++i)
17 {
18
19 GameObject.Instantiate(wave.enemyPrefab, start.position, Quaternion.identity);
20 countEnemyAlive++;
21 if (i != wave.count - 1)
22 yield return new WaitForSeconds(wave.rate);
23 }
24 while (countEnemyAlive > 0)
25 {
26 yield return 0;
27 }
28 yield return new WaitForSeconds(waveRate);
29 }
30 }
31 }
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IBuilder<T> {
//获取到游戏物体身上的脚本对象,从而去赋值
T GetProductClass(GameObject gameObject);
//使用工厂去获取具体的游戏对象
GameObject GetProduct();
//获取数据信息
void GetData(T productClassGo);
//获取特有资源与信息
void GetOtherResource(T productClassGo);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterBuilder : IBuilder<Monster>
{
public int m_monsterID;
private GameObject monsterGo;
public void GetData(Monster productClassGo)
{
productClassGo.monsterID = m_monsterID;
productClassGo.HP = m_monsterID * 100;
productClassGo.currentHP = productClassGo.HP;
productClassGo.initMoveSpeed = m_monsterID;
productClassGo.moveSpeed = m_monsterID;
productClassGo.prize = m_monsterID * 50;
}
public void GetOtherResource(Monster productClassGo)
{
productClassGo.GetMonsterProperty();
}
public GameObject GetProduct()
{
GameObject itemGo = GameController.Instance.GetGameObjectResource("MonsterPrefab");
Monster monster = GetProductClass(itemGo);
GetData(monster);
GetOtherResource(monster);
return itemGo;
}
public Monster GetProductClass(GameObject gameObject)
{
return gameObject.GetComponent<Monster>();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameController : MonoBehaviour {
private static GameController _instance;
public static GameController Instance
{
get
{
return _instance;
}
}
public Level level;
private GameManager mGameManager;
public int[] mMonsterIDList;
public Stage currentStage;
public MapMaker mapMaker;
public Transform targetTrans;
public GameObject targetSignal;
public GridPoint selectGrid;
public RuntimeAnimatorController[] controllers;
public NormalModelPanel normalModelpanel;
public int killMonsterNum;
public int clearItemNum;
public int killMonsterTotalNum;
public int mMonsterIDIndex;
public int carrotHp = 10;
public int coin;
public int gameSpeed;
public bool isPause;
public bool creatingMonster;
public bool gameOver;
public MonsterBuilder monsterBuilder;
public TowerBuilder towerBuilder;
public Dictionary<int, int> towerPriceDict;
public GameObject towerListGo;
public GameObject handleTowerCanvasGo;
private void Awake()
{
#if Game
_instance = this;
mGameManager = GameManager.Instance;
currentStage = mGameManager.currentStage;
normalModelpanel = mGameManager.uiManager.mUIFacade.currentScenePanelDict[StringManager.NormalModelPanel] as NormalModelPanel;
normalModelpanel.EnterPanel();
mapMaker = GetComponent<MapMaker>();
mapMaker.InitMapMaker();
mapMaker.LoadMap(currentStage.mBigLevelID,currentStage.mLevelID);
gameSpeed = 1;
coin = 1000;
monsterBuilder = new MonsterBuilder();
towerBuilder = new TowerBuilder();
for (int i = 0; i < currentStage.mTowerIDList.Length; i++)
{
GameObject itemGo = mGameManager.GetGameObjectResource(FactoryType.UIFactory,"Btn_TowerBuild");
itemGo.transform.GetComponent<ButtonTower>().towerID = currentStage.mTowerIDList[i];
itemGo.transform.SetParent(towerListGo.transform);
itemGo.transform.localPosition = Vector3.zero;
itemGo.transform.localScale = Vector3.one;
}
towerPriceDict = new Dictionary<int, int>
{
{ 1,100},
{ 2,120},
{ 3,140},
{ 4,160},
{ 5,160}
};
controllers = new RuntimeAnimatorController[12];
for (int i = 0; i < controllers.Length; i++)
{
controllers[i] = GetRuntimeAnimatorController("Monster/"+mapMaker.bigLevelID.ToString()+"/"+(i+1).ToString());
}
level = new Level(mapMaker.roundInfoList.Count, mapMaker.roundInfoList);
normalModelpanel.topPage.UpdateCoinText();
normalModelpanel.topPage.UpdateRoundText();
isPause = true;
#endif
}
private void Update()
{
#if Game
if (!isPause)
{
if (killMonsterNum>=mMonsterIDList.Length)
{
if (level.currentRound==level.totalRound)
{
return;
}
AddRoundNum();
}
else
{
if (!creatingMonster)
{
CreateMonster();
}
}
}
else
{
StopCreateMonster();
creatingMonster = false;
}
#endif
}
public void ShowSignal()
{
PlayEffectMusic("NormalMordel/Tower/ShootSelect");
targetSignal.transform.position = targetTrans.position + new Vector3(0,mapMaker.gridHeight/2,0);
targetSignal.transform.SetParent(targetTrans);
targetSignal.SetActive(true);
}
public void HideSignal()
{
targetSignal.gameObject.SetActive(false);
targetTrans = null;
}
public void ChangeCoin(int coinNum)
{
coin += coinNum;
normalModelpanel.UpdatePanel();
}
public void DecreaseHP()
{
PlayEffectMusic("NormalMordel/Carrot/Crash");
carrotHp--;
mapMaker.carrot.UpdateCarrotUI();
}
public bool IfAllClear()
{
for (int x = 0; x < MapMaker.xColumn; x++)
{
for (int y = 0; y < MapMaker.yRow; y++)
{
if (mapMaker.gridPoints[x,y].gridState.hasItem)
{
return false;
}
}
}
return true;
}
public int GetCarrotState()
{
int carrotState = 0;
if (carrotHp>=4)
{
carrotState = 1;
}
else if (carrotHp>=2)
{
carrotState = 2;
}
else
{
carrotState = 3;
}
return carrotState;
}
public void CreateMonster()
{
creatingMonster = true;
InvokeRepeating("InstantiateMonster",(float)1/gameSpeed, (float)1 / gameSpeed);
}
private void InstantiateMonster()
{
PlayEffectMusic("NormalMordel/Monster/Create");
if (mMonsterIDIndex >= mMonsterIDList.Length)
{
StopCreateMonster();
return;
}
GameObject effectGo = GetGameObjectResource("CreateEffect");
effectGo.transform.SetParent(transform);
effectGo.transform.position = mapMaker.monsterPathPos[0];
if (mMonsterIDIndex<mMonsterIDList.Length)
{
monsterBuilder.m_monsterID = level.roundList[level.currentRound].roundInfo.mMonsterIDList[mMonsterIDIndex];
}
GameObject monsterGo = monsterBuilder.GetProduct();
monsterGo.transform.SetParent(transform);
monsterGo.transform.position = mapMaker.monsterPathPos[0];
mMonsterIDIndex++;
}
public void StopCreateMonster()
{
CancelInvoke();
}
public void AddRoundNum()
{
mMonsterIDIndex = 0;
killMonsterNum = 0;
level.AddRoundNum();
level.HandleRound();
normalModelpanel.UpdatePanel();
}
#if Game
public void ShowPrizePage()
{
normalModelpanel.ShowPrizePage();
}
public void StartGame()
{
isPause = false;
level.HandleRound();
}
public void HandleGrid(GridPoint grid)
{
if (grid.gridState.canBuild)
{
if (selectGrid==null)
{
selectGrid = grid;
selectGrid.ShowGrid();
PlayEffectMusic("NormalMordel/Grid/GridSelect");
}
else if (grid==selectGrid)
{
grid.HideGrid();
selectGrid = null;
PlayEffectMusic("NormalMordel/Grid/GridDeselect");
}
else if (grid!=selectGrid)
{
selectGrid.HideGrid();
selectGrid = grid;
selectGrid.ShowGrid();
PlayEffectMusic("NormalMordel/Grid/GridSelect");
}
}
else
{
grid.HideGrid();
grid.ShowCantBuild();
PlayEffectMusic("NormalMordel/Grid/SelectFault");
if (selectGrid!=null)
{
selectGrid.HideGrid();
}
}
}
#endif
public Sprite GetSprite(string resourcePath)
{
return mGameManager.GetSprite(resourcePath);
}
public AudioClip GetAudioClip(string resourcePath)
{
return mGameManager.GetAudioClip(resourcePath);
}
public RuntimeAnimatorController GetRuntimeAnimatorController(string resourcePath)
{
return mGameManager.GetRunTimeAnimatorController(resourcePath);
}
public GameObject GetGameObjectResource(string resourcePath)
{
return mGameManager.GetGameObjectResource(FactoryType.GameFactory,resourcePath);
}
public void PushGameObjectToFactory(string resourcePath,GameObject itemGo)
{
mGameManager.PushGameObjectToFactory(FactoryType.GameFactory,resourcePath,itemGo);
}
public void PlayEffectMusic(string audioClipPath)
{
mGameManager.audioSourceManager.PlayEffectMusic(GetAudioClip(audioClipPath));
}
}
public class Monster : MonoBehaviour
{
public int monsterID;
public int HP;
public int currentHP;
public float moveSpeed;
public float initMoveSpeed;
public int prize;
private Animator animator;
private Slider slider;
private List<Vector3> monsterPointList;
private int roadPointIndex = 1;
private bool reachCarrot;
private bool hasDecreasSpeed;
private float decreaseSpeedTimeVal;
private float decreaseTime;
public AudioClip dieAudioClip;
public RuntimeAnimatorController runtimeAnimatorController;
private GameObject TshitGo;
private void Awake()
{
animator = GetComponent<Animator>();
slider = transform.Find("MonsterCanvas").Find("HPSlider").GetComponent<Slider>();
slider.gameObject.SetActive(false);
monsterPointList = GameController.Instance.mapMaker.monsterPathPos;
TshitGo = transform.Find("TShit").gameObject;
}
private void OnEnable()
{
monsterPointList = GameController.Instance.mapMaker.monsterPathPos;
if (roadPointIndex + 1 < monsterPointList.Count)
{
float xOffset = monsterPointList[0].x - monsterPointList[1].x;
if (xOffset < 0)
{
transform.eulerAngles = new Vector3(0, 0, 0);
}
else if (xOffset > 0)
{
transform.eulerAngles = new Vector3(0, 180, 0);
}
}
}
private void Update()
{
if (GameController.Instance.isPause||GameController.Instance.gameOver)
{
return;
}
if (!reachCarrot)
{
transform.position = Vector3.Lerp(transform.position, monsterPointList[roadPointIndex],
1 / Vector3.Distance(transform.position, monsterPointList[roadPointIndex]) * Time.deltaTime * moveSpeed * GameController.Instance.gameSpeed);
if (Vector3.Distance(transform.position, monsterPointList[roadPointIndex]) <= 0.01f)
{
if (roadPointIndex + 1 < monsterPointList.Count)
{
float xOffset = monsterPointList[roadPointIndex].x - monsterPointList[roadPointIndex + 1].x;
if (xOffset < 0)
{
transform.eulerAngles = new Vector3(0, 0, 0);
}
else if (xOffset > 0)
{
transform.eulerAngles = new Vector3(0, 180, 0);
}
}
slider.gameObject.transform.eulerAngles = Vector3.zero;
roadPointIndex++;
if (roadPointIndex >= GameController.Instance.mapMaker.monsterPathPos.Count)
{
reachCarrot = true;
}
}
}
else
{
DestoryMonster();
GameController.Instance.DecreaseHP();
}
if (hasDecreasSpeed)
{
decreaseSpeedTimeVal += Time.deltaTime;
}
if (decreaseSpeedTimeVal >= decreaseTime)
{
CancelDecreaseDebuff();
decreaseSpeedTimeVal = 0;
}
}
private void DestoryMonster()
{
if (GameController.Instance.targetTrans==transform)
{
GameController.Instance.HideSignal();
}
if (!reachCarrot)
{
GameObject coinGo = GameController.Instance.GetGameObjectResource("CoinCanvas");
coinGo.transform.Find("Emp_Coin").GetComponent<CoinMove>().prize = prize;
coinGo.transform.SetParent(GameController.Instance.transform);
coinGo.transform.position = transform.position;
GameController.Instance.ChangeCoin(prize);
int randomNum = Random.Range(0,100);
if (randomNum<10)
{
GameObject prizeGo = GameController.Instance.GetGameObjectResource("Prize");
prizeGo.transform.position = transform.position-new Vector3(0,0,6);
GameController.Instance.PlayEffectMusic("NormalMordel/GiftCreate");
}
}
GameObject effectGo = GameController.Instance.GetGameObjectResource("DestoryEffect");
effectGo.transform.SetParent(GameController.Instance.transform);
effectGo.transform.position = transform.position;
GameController.Instance.killMonsterNum++;
GameController.Instance.killMonsterTotalNum++;
InitMonsterGo();
GameController.Instance.PushGameObjectToFactory("MonsterPrefab", gameObject);
}
private void InitMonsterGo()
{
monsterID = 0;
HP = 0;
currentHP = 0;
moveSpeed = 0;
roadPointIndex = 1;
dieAudioClip = null;
reachCarrot = false;
slider.value = 1;
slider.gameObject.SetActive(false);
prize = 0;
transform.eulerAngles = new Vector3(0, 0, 0);
decreaseSpeedTimeVal = 0;
decreaseTime = 0;
CancelDecreaseDebuff();
}
private void TakeDamage(int attackValue)
{
slider.gameObject.SetActive(true);
currentHP -= attackValue;
if (currentHP < 0)
{
GameController.Instance.PlayEffectMusic("NormalMordel/Monster/"+GameController.Instance.currentStage.mBigLevelID.ToString()+"/"+monsterID.ToString());
DestoryMonster();
return;
}
slider.value = (float)currentHP / HP;
}
private void DecreaseSpeed(BullectProperty bullectProperty)
{
if (!hasDecreasSpeed)
{
moveSpeed = moveSpeed - bullectProperty.debuffValue;
TshitGo.SetActive(true);
}
decreaseSpeedTimeVal = 0;
hasDecreasSpeed = true;
decreaseTime = bullectProperty.debuffTime;
}
private void CancelDecreaseDebuff()
{
hasDecreasSpeed = false;
moveSpeed = initMoveSpeed;
TshitGo.SetActive(false);
}
public void GetMonsterProperty()
{
runtimeAnimatorController = GameController.Instance.controllers[monsterID - 1];
animator.runtimeAnimatorController = runtimeAnimatorController;
}
#if Game
private void OnMouseDown()
{
if (GameController.Instance.targetTrans == null)
{
GameController.Instance.targetTrans = transform;
GameController.Instance.ShowSignal();
}
else if (GameController.Instance.targetTrans != transform)
{
GameController.Instance.HideSignal();
GameController.Instance.targetTrans = transform;
GameController.Instance.ShowSignal();
}
else if (GameController.Instance.targetTrans == transform)
{
GameController.Instance.HideSignal();
}
}
#endif
}