IEnumerator SpawnEnemy(int pathIndex, int[] prefabIndex, int[] count, bool waitFlag) { List <GameObject> curEnemyGroup = new List <GameObject>(); int curEnemyGroupIndex = GeneralPool.addToEnemyGroupList(curEnemyGroup); for (int i = 0; i < prefabIndex.Length; i++) { for (int j = 0; j < count[i]; j++) { GameObject enemy = GameObject.Instantiate(EnemyPrefabsList[prefabIndex[i]], AllPath[pathIndex].transform.GetChild(0).transform.position, Quaternion.identity); enemy.transform.parent = EnemyParent; if (AllPath[pathIndex].transform.childCount > 1) { enemy.transform.LookAt(AllPath[pathIndex].transform.GetChild(1).transform.position, Vector3.up); } Enemy enemyComp = enemy.GetComponent <Enemy>(); enemyComp.InitWithData(AllPath[pathIndex]); GeneralPool.addToEnemyGroup(enemy, curEnemyGroupIndex); if (tempWalkFlag) { enemyComp.StartWalk(); } if (waitFlag) { yield return(new WaitForSeconds(0.5f)); } else { yield return(null); } } } }
private void Detect() { List <Vector2> gridPosList = new List <Vector2>(); foreach (Vector2 off in towerDetectScope) { Vector2 pos = new Vector2((float)Mathf.Floor(transform.position.x) + 0.5f, (float)Mathf.Floor(transform.position.z) + 0.5f); pos += off; gridPosList.Add(pos); } List <Vector2> enemyPosList = new List <Vector2>(); List <GameObject> enemyList = GeneralPool.get_enemyList(); foreach (GameObject enemy in enemyList) { Vector2 pos = new Vector2((float)Mathf.Floor(enemy.transform.position.x) + 0.5f, (float)Mathf.Floor(enemy.transform.position.z) + 0.5f); enemyPosList.Add(pos); } //Debug.Log(gridPosList.Count.ToString() + " " + enemyPosList.Count.ToString()); detectedEnemyList.Clear(); for (int i = 0; i < enemyPosList.Count; i++) { for (int j = 0; j < gridPosList.Count; j++) { if (enemyPosList[i] == gridPosList[j]) { detectedEnemyList.Add(enemyList[i]); } } } }
// Update is called once per frame void Update() { towerList = GeneralPool.get_towerList(); healthBarTransform.position = Camera.main.WorldToScreenPoint(healthBarDefineTransform.position); Detect(); if (enemyState == BasicInfo.enemyStates.Stop) { UpdateEnemyByState(); } else { if (detectedTowerList.Count > 0) { enemyState = BasicInfo.enemyStates.Attack; UpdateEnemyByState(); enemyLastState = BasicInfo.enemyStates.Attack; } else { enemyState = BasicInfo.enemyStates.Walk; UpdateEnemyByState(); enemyLastState = BasicInfo.enemyStates.Walk; } } // UpdateEnemyByState(); }
public void SellFocusTower() { if (focusTower != null) { float sellCoins = 0; Tower focusTowerComp = focusTower.GetComponent <Tower>(); if (focusTowerComp.getRoundWhenCreated() != currentRound) { sellCoins = focusTowerComp.towerPrice / 2; } else { sellCoins = focusTowerComp.towerPrice; } sellCoins *= (focusTowerComp.getCurrentHealth() / focusTowerComp.towerTotalHealth); GeneralPool.coins += sellCoins; uiHelper.updateCoinCountText(GeneralPool.coins); GeneralPool.getBP(focusTower).SetActive(true); GeneralPool.removeFromTowerAndBPDict(focusTower); GeneralPool.removeFromTowerList(focusTower); Destroy(focusTower); focusTower = null; towerOperatePanel_Prepare.transform.localScale = Vector3.zero; } }
public void Die() { dieAlready = true; Debug.Log("当前敌人死亡前,enemyList数量为:" + GeneralPool.get_enemyList().Count); GeneralPool.removeFromEnemyGroup(gameObject); modelAnim.Play("death"); Invoke("destroyGameObject", 3f); }
// Update is called once per frame void Update() { if (!waitflag) { if (gameStep == 0) { } else { List <GameObject> enemyList = GeneralPool.get_enemyList(); //Debug.Log(enemyList.Count); if (enemyList.Count == 0) { toStep0(); } else { bool stopFlag = true; foreach (GameObject enemy in enemyList) { if (enemy.GetComponent <Enemy>().getEnemyState() != BasicInfo.enemyStates.Stop) { stopFlag = false; break; } } if (stopFlag) { toStep0(); } else { if (gameStep == 1) { timerTime -= Time.deltaTime; uiHelper.updateTimerText(timerTime); if (timerTime < 0) { toStep2(); } } else if (gameStep == 2) { } } } //Debug.Log(gateList.Count+","+gateCount); if (gateList.Count < gateCount) { gameOver(0); } } } }
public void ClearAllEnemies() { foreach (GameObject enemy in GeneralPool.get_enemyList()) { Destroy(enemy); } foreach (List <GameObject> enemyGroup in GeneralPool.get_enemyGroupList()) { enemyGroup.Clear(); } GeneralPool.get_enemyGroupList().Clear(); }
public void ClearAll() { foreach (GameObject enemy in GeneralPool.get_enemyList()) { Destroy(enemy); } foreach (GameObject tower in GeneralPool.get_towerList()) { Destroy(tower); } GeneralPool.resetPool(); }
private void Detect() { List <Vector2> gridPosList = new List <Vector2>(); Vector2 pos = new Vector2((float)Mathf.Floor(transform.position.x) + 0.5f, (float)Mathf.Floor(transform.position.z) + 0.5f); foreach (Vector2 off in enemyDetectScope) { Vector2 temppos = pos; temppos += off; gridPosList.Add(temppos); } List <Vector2> towerPosList = new List <Vector2>(); towerList = GeneralPool.get_towerList(); //Debug.Log(towerList.Count); foreach (GameObject tower in towerList) { Vector2 towerpos = new Vector2((float)Mathf.Floor(tower.transform.position.x) + 0.5f, (float)Mathf.Floor(tower.transform.position.z) + 0.5f); towerPosList.Add(towerpos); } detectedTowerList.Clear(); //List<Vector2> detectedTowerPosList_toGridList = new List<Vector2>(); for (int i = 0; i < towerPosList.Count; i++) { for (int j = 0; j < gridPosList.Count; j++) { //Debug.Log(towerPosList[i].x.ToString() + "," + towerPosList[i].y.ToString() + "/" + gridPosList[i].x.ToString() + "," + gridPosList[i].y.ToString()); if (towerPosList[i] == gridPosList[j]) { detectedTowerList.Add(towerList[i]); //detectedTowerPosList_toGridList.Add(new Vector2(towerList[i].transform.position.x, towerList[i].transform.position.y) - pos); } } } // Debug.Log("检测到的塔:"+detectedTowerList.Count); // Debug.Log("塔总数:"+towerList.Count); // detectedTowerList.Sort(delegate(GameObject t1,GameObject t2){ // Vector2 t1Vec2=new Vector2(t1.transform.position.x,t1.transform.position.z)-pos; // float t1Vec2Len=t1Vec2.magnitude; // Vector2 t2Vec2=new Vector2(t2.transform.position.x,t2.transform.position.z)-pos; // float t2Vec2Len=t2Vec2.magnitude; // return t1Vec2Len.CompareTo(t2Vec2Len); // }); // foreach (GameObject tower in detectedTowerList) // { // Debug.Log(tower.transform.position); // } }
// Start is called before the first frame update void Start() { GeneralPool.resetPool(); gateCount = gateList.Count; foreach (GameObject gate in gateList) { GeneralPool.addToTowerList(gate); } uiHelper = GetComponent <UIHelper>(); towerController = GetComponent <TowerController>(); enemyController = GetComponent <EnemyController>(); enemySpawner = GetComponent <EnemySpawner>(); currentRound = 0; toStep0(); }
public void setGameStep(int gameStep) { this.gameStep = gameStep; if (gameStep == 1) { displayPath.HidePathOfEnemyGroup(); foreach (GameObject enemy in GeneralPool.get_enemyList()) { enemy.GetComponent <QuickOutline>().enabled = false; } for (int i = 0; i < enemyScrollViewContent_Prepare.childCount; i++) { Destroy(enemyScrollViewContent_Prepare.GetChild(i).gameObject); } } }
public void Die() { if (towerName == "Gate") { GameObject.Find("GameController").GetComponent <RoundController>().removeFromGateList(gameObject); } else { GameObject BP = GeneralPool.getBP(gameObject); if (BP == null) { } else { BP.SetActive(true); } } GeneralPool.removeFromTowerAndBPDict(gameObject); GeneralPool.removeFromTowerList(gameObject); Destroy(gameObject); }
void AttackTimer() { if (detectedEnemyList.Count > 0) { //Debug.Log("攻击一次"); if (towerAttackScope > 0)//攻击范围大于0 { List <Vector2> offList = new List <Vector2>(); for (int i = 1; i <= towerAttackScope; ++i) { for (int j = 0; j <= i; ++j) { int k = i - j; if (j > 0 && k == 0) { offList.Add(new Vector2(j, k)); offList.Add(new Vector2(-j, k)); } else if (j == 0 && k > 0) { offList.Add(new Vector2(j, k)); offList.Add(new Vector2(j, -k)); } else if (j > 0 && k > 0) { offList.Add(new Vector2(j, k)); offList.Add(new Vector2(-j, k)); offList.Add(new Vector2(j, -k)); offList.Add(new Vector2(-j, -k)); } } } List <Vector2> gridPosList = new List <Vector2>(); foreach (Vector2 off in offList) { Vector2 pos = new Vector2((float)Mathf.Floor(detectedEnemyList[0].transform.position.x) + 0.5f, (float)Mathf.Floor(transform.position.z) + 0.5f); pos += off; gridPosList.Add(pos); } List <Vector2> enemyPosList = new List <Vector2>(); List <GameObject> enemyList = GeneralPool.get_enemyList(); foreach (GameObject enemy in enemyList) { Vector2 pos = new Vector2((float)Mathf.Floor(enemy.transform.position.x) + 0.5f, (float)Mathf.Floor(enemy.transform.position.z) + 0.5f); enemyPosList.Add(pos); } List <GameObject> detectedEnemyList_inAttackScope = new List <GameObject>(); detectedEnemyList_inAttackScope.Add(detectedEnemyList[0]); for (int i = 0; i < enemyPosList.Count; i++) { for (int j = 0; j < gridPosList.Count; j++) { if (enemyPosList[i] == gridPosList[j]) { detectedEnemyList_inAttackScope.Add(enemyList[i]); } } } foreach (GameObject detectedEnemy_inAttackScope in detectedEnemyList_inAttackScope) { Enemy detectedEnemyComp_inAttackScope = detectedEnemy_inAttackScope.GetComponent <Enemy>(); float towerAttackPower_final = BasicInfo.calcuteAttackPower(towerAttackPower, this.towerAttr, detectedEnemyComp_inAttackScope.enemyAttr); detectedEnemy_inAttackScope.GetComponent <Enemy>().GetAttacked(towerAttackPower_final); } } else { Enemy detectedEnemyComp = detectedEnemyList[0].GetComponent <Enemy>(); float towerAttackPower_final = BasicInfo.calcuteAttackPower(towerAttackPower, this.towerAttr, detectedEnemyComp.enemyAttr); detectedEnemyComp.GetAttacked(towerAttackPower_final); } } else { TimersManager.ClearTimer(AttackTimer); } }
// Update is called once per frame void Update() { if (loadedflag_inner) { //Debug.Log("gamestep情况:"+gameStep); if (gameStep == 0) { if (towerMode) { foreach (GameObject tower in GeneralPool.get_towerList()) { if (tower.tag == "Tower") { Collider towerColli = tower.GetComponent <Collider>(); if (towerColli != null) { tower.GetComponent <Collider>().enabled = false; } } } //创建一条从摄像机到触摸位置的射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 定义射线 RaycastHit rayHit; if (Physics.Raycast(ray, out rayHit, 200)) // 参数1 射线,参数2 碰撞信息, 参数3 碰撞层 { //Debug.Log(rayHit.collider.gameObject.name); if (rayHit.collider.gameObject.tag == "BuildablePlane") { Vector3 hitpoint = rayHit.point; float hitpoint_x = hitpoint.x; float hitpoint_y = hitpoint.y; float hitpoint_z = hitpoint.z; float hitpoint_x_center = Mathf.Floor(hitpoint_x) + 0.5f; float hitpoint_z_center = Mathf.Floor(hitpoint_z) + 0.5f; tempTower.transform.position = new Vector3(hitpoint_x_center, hitpoint_y, hitpoint_z_center); if (!tempTower.activeSelf) { tempTower.SetActive(true); } if (CheckGuiRaycastObjects()) { return; } if (Input.GetMouseButtonDown(0))//建塔 { if (tempTower.activeSelf) { if (GeneralPool.coins >= tempTowerComp.towerPrice) { uiHelper.updateCoinCountText(GeneralPool.coins); GameObject realTower = Instantiate(towerPrefab, tempTower.transform.position, new Quaternion()); realTower.transform.parent = TowerParent; Tower realTowerComp = realTower.GetComponent <Tower>(); realTowerComp.setRoundWhenCreated(currentRound); GameObject realTowerScopePlane = realTowerComp.getScopePlane(); realTowerScopePlane.SetActive(false); List <Vector3> realTowerScopePlanePos = realTowerComp.getScopePlanePosList(); displayScopePlane.DisplayScopeOfTower(realTowerScopePlanePos, realTowerScopePlane.transform); GeneralPool.addToTowerList(realTower); GeneralPool.addToTowerAndBPDict(realTower, rayHit.collider.gameObject); rayHit.collider.gameObject.SetActive(false); GeneralPool.coins -= realTowerComp.towerPrice; uiHelper.updateCoinCountText(GeneralPool.coins); //Debug.Log(rayHit.collider.gameObject.name); } else { Debug.Log("金币不足"); uiHelper.ShowAlarm("金币不足"); } } } } else { if (tempTower.activeSelf) { //Debug.Log("nothing"); tempTower.SetActive(false); } } } } else//非TowerMode { //非TowerMode中所有塔都可以被点击,要先全设置为碰撞体 foreach (GameObject tower in GeneralPool.get_towerList()) { if (tower.tag == "Tower") { Collider towerColli = tower.GetComponent <Collider>(); if (towerColli != null) { tower.GetComponent <Collider>().enabled = true; } } } if (CheckGuiRaycastObjects()) { return; } if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 定义射线 RaycastHit rayHit; if (Physics.Raycast(ray, out rayHit, 200)) // 参数1 射线,参数2 碰撞信息, 参数3 碰撞层 { GameObject rayHitObject = rayHit.collider.gameObject; if (rayHitObject.tag == "Tower")//点击塔会显示塔的外轮廓,塔的检测范围,以及塔的选项 { if (focusTower == rayHitObject) { QuickOutline towerOutline = rayHitObject.GetComponent <QuickOutline>(); towerOutline.enabled = false; focusTower = null; //towerOperatePanel_Prepare.transform.localScale = Vector3.zero; } else { // foreach (GameObject tower in GeneralPool.get_towerList()) // { // if (tower.tag == "Tower") // { // tower.GetComponent<QuickOutline>().enabled = false; // Transform OneScopePlaneTransform = tower.transform.Find("scopePlane"); // OneScopePlaneTransform.gameObject.SetActive(false); // } // } if (focusTower == null) { } else { focusTower.GetComponent <QuickOutline>().enabled = false; Transform OneScopePlaneTransform = focusTower.transform.Find("scopePlane"); OneScopePlaneTransform.gameObject.SetActive(false); towerOperatePanel_Prepare.transform.localScale = Vector3.zero; } focusTower = rayHitObject; focusTower.GetComponent <QuickOutline>().enabled = true; } GameObject TowerScopePlane = rayHitObject.transform.Find("scopePlane").gameObject; TowerScopePlane.SetActive(!TowerScopePlane.activeSelf); switchTowerOperatePanel_Prepare(rayHitObject); } else if (rayHitObject.name == "Road1" || rayHitObject.name == "Road2") { Debug.Log("its road"); } else { Debug.Log(rayHitObject.name); // foreach (GameObject tower in GeneralPool.get_towerList()) // { // if (tower.tag == "Tower") // { // tower.GetComponent<QuickOutline>().enabled = false; // Transform OneScopePlaneTransform = tower.transform.Find("scopePlane"); // OneScopePlaneTransform.gameObject.SetActive(false); // } // } if (focusTower != null) { focusTower.GetComponent <QuickOutline>().enabled = false; Transform OneScopePlaneTransform = focusTower.transform.Find("scopePlane"); OneScopePlaneTransform.gameObject.SetActive(false); } focusTower = null; towerOperatePanel_Prepare.transform.localScale = Vector3.zero; } } } if (focusTower != null) { towerOperatePanel_Prepare.transform.position = Camera.main.WorldToScreenPoint(focusTower.transform.position); } } } else//在出兵阶段和交战阶段,点击塔可以显示塔的攻击范围,塔名和属性,紧急修复按钮,及技能按钮 { //此时所有塔都可以被点击,要先全设置为碰撞体 foreach (GameObject tower in GeneralPool.get_towerList()) { if (tower.tag == "Tower") { Collider towerColli = tower.GetComponent <Collider>(); if (towerColli != null) { tower.GetComponent <Collider>().enabled = true; } } } if (CheckGuiRaycastObjects()) { return; } if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 定义射线 RaycastHit rayHit; if (Physics.Raycast(ray, out rayHit, 200)) // 参数1 射线,参数2 碰撞信息, 参数3 碰撞层 { GameObject rayHitObject = rayHit.collider.gameObject; if (rayHitObject.tag == "Tower")//点击塔会显示塔的外轮廓,塔的检测范围,以及塔的选项 { if (focusTower == rayHitObject) { QuickOutline towerOutline = rayHitObject.GetComponent <QuickOutline>(); towerOutline.enabled = false; focusTower = null; //towerOperatePanel_Prepare.transform.localScale = Vector3.zero; } else { // foreach (GameObject tower in GeneralPool.get_towerList()) // { // if (tower.tag == "Tower") // { // tower.GetComponent<QuickOutline>().enabled = false; // Transform OneScopePlaneTransform = tower.transform.Find("scopePlane"); // OneScopePlaneTransform.gameObject.SetActive(false); // } // } if (focusTower == null) { } else { focusTower.GetComponent <QuickOutline>().enabled = false; Transform OneScopePlaneTransform = focusTower.transform.Find("scopePlane"); OneScopePlaneTransform.gameObject.SetActive(false); towerOperatePanel_Battle.transform.localScale = Vector3.zero; } focusTower = rayHitObject; focusTower.GetComponent <QuickOutline>().enabled = true; } GameObject TowerScopePlane = rayHitObject.transform.Find("scopePlane").gameObject; TowerScopePlane.SetActive(!TowerScopePlane.activeSelf); switchTowerOperatePanel_Battle(rayHitObject); } else if (rayHitObject.name == "Road1" || rayHitObject.name == "Road2") { Debug.Log("its road"); } else { Debug.Log(rayHitObject.name); // foreach (GameObject tower in GeneralPool.get_towerList()) // { // if (tower.tag == "Tower") // { // tower.GetComponent<QuickOutline>().enabled = false; // Transform OneScopePlaneTransform = tower.transform.Find("scopePlane"); // OneScopePlaneTransform.gameObject.SetActive(false); // } // } if (focusTower != null) { focusTower.GetComponent <QuickOutline>().enabled = false; Transform OneScopePlaneTransform = focusTower.transform.Find("scopePlane"); OneScopePlaneTransform.gameObject.SetActive(false); } focusTower = null; towerOperatePanel_Battle.transform.localScale = Vector3.zero; } } } if (focusTower != null) { towerOperatePanel_Battle.transform.position = Camera.main.WorldToScreenPoint(focusTower.transform.position); } else { towerOperatePanel_Battle.transform.localScale = Vector3.zero; } } } else//loadedflag_inner为false,说明资源还未全部加载完成 { } }
// Update is called once per frame void Update() { if (loadedflag_inner) { if (CheckGuiRaycastObjects()) { return; } if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 定义射线 RaycastHit rayHit; if (Physics.Raycast(ray, out rayHit, 200)) // 参数1 射线,参数2 碰撞信息, 参数3 碰撞层 { GameObject rayHitObject = rayHit.collider.gameObject; //Debug.Log(rayHitObject.name); if (rayHitObject.name == "Road1" || rayHitObject.name == "Road2") { Vector3 hitpoint = rayHit.point; float hitpoint_x = hitpoint.x; float hitpoint_y = hitpoint.y; float hitpoint_z = hitpoint.z; hitpoint_x_center = Mathf.Floor(hitpoint_x) + 0.5f; hitpoint_z_center = Mathf.Floor(hitpoint_z) + 0.5f; displayPath.HidePathOfEnemyGroup(); foreach (GameObject enemy in GeneralPool.get_enemyList()) { enemy.GetComponent <QuickOutline>().enabled = false; } } else if (rayHitObject.tag == "Tower" || rayHitObject.tag == "BuildablePlane") { } else { hitpoint_x_center = 1000f; hitpoint_z_center = 1000f; displayPath.HidePathOfEnemyGroup(); foreach (GameObject enemy in GeneralPool.get_enemyList()) { enemy.GetComponent <QuickOutline>().enabled = false; } } } List <GameObject> insideEnemyList = new List <GameObject>(); foreach (GameObject enemy in GeneralPool.get_enemyList()) { //displayPath.HidePathOfEnemyGroup(); //enemy.GetComponent<QuickOutline>().enabled = false; if (Mathf.Floor(enemy.transform.position.x) + 0.5f == hitpoint_x_center && Mathf.Floor(enemy.transform.position.z) + 0.5f == hitpoint_z_center) { insideEnemyList.Add(enemy); } } //List<int> insideEnemyGroupIndexs = new List<int>(); foreach (GameObject insideEnemy in insideEnemyList) { insideEnemy.GetComponent <QuickOutline>().enabled = true; //int enemyGroupIndex = GeneralPool.get_enemyGroupIndex(insideEnemy); //if (enemyGroupIndex == -1) //{ // Debug.Log("存在Bug:某一enemy没有加入军团"); //} //else //{ // if (!insideEnemyGroupIndexs.Contains(enemyGroupIndex)) // insideEnemyGroupIndexs.Add(enemyGroupIndex); //} } changeEnemyScrollView_and_DisplayPath(insideEnemyList); } updateEnemyScrollView(); } }