| | |
| | | /// </summary> |
| | | Camera m_Camera; |
| | | |
| | | //Camera m_CameraBG; |
| | | |
| | | |
| | | /// <summary> |
| | | /// Current tower placeholder. Will be null if not in the <see cref="State.Building" /> state. |
| | | /// </summary> |
| | |
| | | |
| | | //首次购买宝石特效 |
| | | public GameObject fireAppearEffect1; |
| | | public GameObject fireAppearEffect2; |
| | | //public GameObject fireAppearEffect2; |
| | | |
| | | public GameObject waterAppearEffect1; |
| | | public GameObject waterAppearEffect2; |
| | | //public GameObject waterAppearEffect2; |
| | | public GameObject woodAppearEffect1; |
| | | public GameObject woodAppearEffect2; |
| | | //public GameObject woodAppearEffect2; |
| | | /// <summary> |
| | | /// 保存所有生成或合成的塔的最小等级 |
| | | /// </summary> |
| | |
| | | // ATTENTION TO FIX: 先写死,有一个简单的逻辑再说: |
| | | if (m_listTower.Count >= MAX_TOWERNUM) |
| | | disableRandomTowerBtn(); |
| | | } |
| | | |
| | | public void PlayBuffPS(int get_buffID) |
| | | { |
| | | //Debug.Log("开始播放特效"); |
| | | int targetID = 0; |
| | | switch (get_buffID) |
| | | { |
| | | case 0: |
| | | //无特效 |
| | | break; |
| | | case 1: |
| | | for (int i = 0; i < m_listTower.Count; i++) |
| | | { |
| | | m_listTower[i].CurrentTowerLevel.ShowBuffPS(); |
| | | } |
| | | break; |
| | | case 2: |
| | | targetID = 101; |
| | | break; |
| | | case 3: |
| | | targetID = 201; |
| | | break; |
| | | case 4: |
| | | targetID = 301; |
| | | break; |
| | | } |
| | | if (targetID > 1) |
| | | { |
| | | for (int i = 0; i < m_listTower.Count; i++) |
| | | { |
| | | if (m_listTower[i].ElfId == targetID) |
| | | { |
| | | m_listTower[i].CurrentTowerLevel.ShowBuffPS(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | return; |
| | | } |
| | | if (state == State.GameOver) |
| | | { |
| | | CommonDebugHelper.DebugError("已经游戏结束了,为什么还在修改状态"); |
| | | return; |
| | | } |
| | | CommonDebugHelper.Debug($"设置了状态 state:{state} newState:{newState} "); |
| | | |
| | | State oldState = state; |
| | | if (oldState == State.Paused || oldState == State.GameOver) |
| | | { |
| | |
| | | /// </summary> |
| | | public void GameOver() |
| | | { |
| | | CommonDebugHelper.Debug("游戏结束了"); |
| | | |
| | | SetState(State.GameOver); |
| | | } |
| | | |
| | |
| | | //Debug.Log("未上阵区域,不管有没有塔,都强行吸附"); |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, ""); |
| | | |
| | | m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions); |
| | | m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y); |
| | | |
| | | //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions); |
| | | |
| | | } |
| | | else if (m_GridPosition.y == 2 || m_GridPosition.y == 3) |
| | | { |
| | | //Debug.Log("已上阵区域,如果是空格子就强行吸附,先判断是否有塔"); |
| | | |
| | | //pointerInfo.currentPosition += new Vector2(0, -25f); |
| | | checkTowerPlaceTower = isFreeAttackGridOnDrag(pointerInfo); |
| | | |
| | | if (checkTowerPlaceTower != null) |
| | | { |
| | | //Debug.Log(checkTowerPlaceTower.name); |
| | | //Debug.Log($"checkTowerPlaceTower.name:{checkTowerPlaceTower.name} m_GridPosition:{m_GridPosition}"); |
| | | |
| | | if (m_CurrentTower.controller.towerFeature == EFeatureTower.NULL) |
| | | { |
| | | if (checkTowerPlaceTower.bInAttackMode) |
| | | { |
| | | //Debug.Log("检测到了塔"); |
| | | //鼠标检测到了塔 |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, false, ""); |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(checkTowerPlaceTower.gridPosition.x, checkTowerPlaceTower.gridPosition.y, false, ""); |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(checkTowerPlaceTower.gridPosition, m_CurrentTower.controller.dimensions); |
| | | m_CurrentTower.SetGridPosition(checkTowerPlaceTower.gridPosition.x, checkTowerPlaceTower.gridPosition.y); |
| | | |
| | | //Debug.Log("未上阵区域,不管有没有塔,都强行吸附" + checkTowerPlaceTower.gridPosition); |
| | | |
| | | //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(checkTowerPlaceTower.gridPosition, m_CurrentTower.controller.dimensions); |
| | | } |
| | | } |
| | | else if ((m_CurrentArea as TowerPlacementGridEndless).isFreeAtackPos(m_GridPosition.x, m_GridPosition.y)) |
| | |
| | | |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, towerToMove.towerName); |
| | | |
| | | m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions); |
| | | m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y); |
| | | |
| | | //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions); |
| | | |
| | | } |
| | | else |
| | |
| | | |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, towerToMove.towerName); |
| | | |
| | | m_CurrentTower.transform.position = towerToMove.position; |
| | | //m_CurrentTower.transform.position = towerToMove.position; |
| | | m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y); |
| | | |
| | | } |
| | | else |
| | | { |
| | | CloseCanPlace(); |
| | | //CloseCanPlace(); |
| | | |
| | | //Debug.Log("上阵区域,没有开放的塔位"); |
| | | |
| | | (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, ""); |
| | | |
| | | m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y); |
| | | |
| | | //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions); |
| | | } |
| | | } |
| | | } |
| | |
| | | else |
| | | { |
| | | dragTowerPlacement.CloseCanPlace(); |
| | | |
| | | m_CurrentTower.SetGridPosition(-1, -1); |
| | | //Debug.Log("没有检测到"); |
| | | } |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | if (m_CurrentTower.gridPositionX != -1) |
| | | { |
| | | IntVector2 moveV2 = new IntVector2(m_CurrentTower.gridPositionX, m_CurrentTower.gridPositionY); |
| | | //判断是否未开塔 |
| | | if (!dragTowerPlacement.IsGridOpen(moveV2.x, moveV2.y)) |
| | | { |
| | | //Debug.Log("未开塔"); |
| | | CancelPlaceTower(pointerInfo); |
| | | |
| | | } |
| | | else if (moveV2 == towerToMove.gridPosition) |
| | | { |
| | | //Debug.Log($"在原位 moveV2:{moveV2} towerToMove.gridPosition:{towerToMove.gridPosition}"); |
| | | CancelPlaceTower(pointerInfo); |
| | | } |
| | | else |
| | | { |
| | | //判断是否有塔 |
| | | Tower tmpT = null; |
| | | for (int i = 0; i < m_listTower.Count; i++) |
| | | { |
| | | if (m_listTower[i].gridPosition == moveV2) |
| | | { |
| | | tmpT = m_listTower[i]; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (tmpT != null) |
| | | { |
| | | //Debug.Log("释放的时候有塔"); |
| | | DragBuyTower(tmpT); |
| | | } |
| | | else |
| | | { |
| | | //Debug.Log("释放的时候是空格子"); |
| | | DragBuyTower(moveV2); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //Debug.Log("不在区域内"); |
| | | CancelPlaceTower(pointerInfo); |
| | | } |
| | | |
| | | return; |
| | | |
| | | // 判断目标位置是否有Tower且类型和等级一致,如果没有,则GhostTower删除,原Tower显示。 |
| | | if (isValidateCombineTarget(pointerInfo)) |
| | | { |
| | | //Debug.Log("isValidateCombineTarget"); |
| | | //Debug.Log("目标位置是否有同等级同类型的Tower."); |
| | | TryPlaceTower(pointerInfo); |
| | | EndlessRandomTower.instance.UpdateDescDisplay(); |
| | | } |
| | |
| | | } |
| | | else if (EndlessLevelManager.instanceExists && IsSubstitute(pointerInfo)) |
| | | { |
| | | //Debug.Log("IsSubstitute"); |
| | | //Debug.Log("交换"); |
| | | |
| | | CheckCanChangePos(pointerInfo); |
| | | } |
| | |
| | | if (sTower == null) |
| | | return false; |
| | | |
| | | Debug.Log("开始检测是否可以交换塔"); |
| | | //Debug.Log("开始检测是否可以交换塔"); |
| | | //if (sTower.bInAttackMode == towerToMove.bInAttackMode) |
| | | { |
| | | IntVector2 v1 = new IntVector2(towerToMove.gridPosition.x, towerToMove.gridPosition.y); |
| | |
| | | return controller; |
| | | } |
| | | |
| | | private Vector2 dragOffect = new Vector2(0, -55f); |
| | | /// <summary> |
| | | /// Position the ghost tower at the given pointer |
| | | /// </summary> |
| | |
| | | return; |
| | | //throw new InvalidOperationException("Trying to move the tower ghost when we don't have one"); |
| | | } |
| | | // 我操,终于可以了!ATTENTION TO OPP: |
| | | PointerInfo tp = new PointerActionInfo(); |
| | | tp.currentPosition = pointerInfo.currentPosition + dragOffect; |
| | | tp.previousPosition = pointerInfo.previousPosition; |
| | | tp.delta = pointerInfo.delta; |
| | | tp.startedOverUI = pointerInfo.startedOverUI; |
| | | |
| | | UIPointer pointer = WrapPointer(pointerInfo); |
| | | UIPointer npt = new UIPointer |
| | | { |
| | | overUI = false, |
| | | pointer = tp, |
| | | overWaveLine = false, |
| | | ray = m_Camera.ScreenPointToRay(tp.currentPosition) |
| | | }; |
| | | |
| | | //UIPointer pointer = WrapPointer(tp); |
| | | // Do nothing if we're over UI |
| | | if (pointer.overUI && hideWhenInvalid) |
| | | if (npt.overUI && hideWhenInvalid) |
| | | { |
| | | m_CurrentTower.Hide(); |
| | | return; |
| | | } |
| | | MoveGhost(pointer, hideWhenInvalid); |
| | | MoveGhost(npt, hideWhenInvalid); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | return true; |
| | | } |
| | | |
| | | private void DragBuyTower(Tower sTower) |
| | | { |
| | | Tower curTower = m_CurrentTower.controller; |
| | | int testLvl = dragTowerLevel; |
| | | if ((sTower.currentLevel == testLvl) && |
| | | (sTower.towerName == curTower.towerName)) |
| | | { |
| | | // 先释放掉当前的Ghost塔防. |
| | | CancelGhostPlacement(); |
| | | |
| | | // 升级目标位置的塔防. |
| | | currentSelectedTower = sTower; |
| | | SetState(State.Normal); |
| | | // 新的代码,合并升级为随机塔防类型. |
| | | randomUpgradeTower(); |
| | | } |
| | | else |
| | | { |
| | | IntVector2 v1 = new IntVector2(towerToMove.gridPosition.x, towerToMove.gridPosition.y); |
| | | IntVector2 v2 = new IntVector2(sTower.gridPosition.x, sTower.gridPosition.y); |
| | | |
| | | Tower newTower1 = PlaceTowerForce(EndlessRandomTower.instance.getTowerByName(sTower.towerName), v1, sTower.currentLevel + 1, false); |
| | | Tower newTower2 = PlaceTowerForce(m_CurrentTower.controller, v2, towerToMove.currentLevel + 1, false); |
| | | |
| | | if (towerToMove != null) |
| | | { |
| | | delTower(towerToMove); |
| | | towerToMove.showTower(true); |
| | | towerToMove.Sell(); |
| | | towerToMove = null; |
| | | } |
| | | |
| | | delTower(sTower); |
| | | sTower.showTower(true); |
| | | sTower.Sell(); |
| | | sTower = null; |
| | | |
| | | CancelGhostPlacement(); |
| | | |
| | | newTower1.placementArea.Occupy(newTower1.gridPosition, newTower1.dimensions); |
| | | newTower2.placementArea.Occupy(newTower2.gridPosition, newTower2.dimensions); |
| | | |
| | | //强制交换塔的时候检查自身充能条 |
| | | newTower1.CheckCtrl(); |
| | | newTower2.CheckCtrl(); |
| | | //Debug.Log($"newTower1:{newTower1.towerName} newTower2:{newTower2.towerName}"); |
| | | |
| | | TowerPlacementGridEndless.instance.PlayPutPs(newTower2.gridPosition.x, newTower2.gridPosition.y); |
| | | } |
| | | } |
| | | |
| | | private void DragBuyTower(IntVector2 dragGridPosition) |
| | | { |
| | | Tower controller = m_CurrentTower.controller; |
| | | Tower createdTower = Instantiate(controller); |
| | | createdTower.Initialize(m_CurrentArea, dragGridPosition, dragTowerLevel); |
| | | |
| | | // ATTENTION TO FIX:是否应该加入List: |
| | | addTower(createdTower); |
| | | PlayToAttackEffect(createdTower.ElfId, createdTower.transform.position); |
| | | dragTowerLevel = 0; |
| | | CancelGhostPlacement(); |
| | | |
| | | // 删除towerToMove,确保塔防数据不再出现多个 |
| | | if (towerToMove != null) |
| | | { |
| | | delTower(towerToMove); |
| | | towerToMove.showTower(true); |
| | | towerToMove.Sell(); |
| | | towerToMove = null; |
| | | } |
| | | if (m_CurrentTower != null && m_CurrentTower.controller != null) |
| | | Destroy(m_CurrentTower.controller.gameObject); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 播放升级特效 |
| | | /// </summary> |
| | |
| | | { |
| | | //火元素 |
| | | PlayAppearEffect(worldPos, fireAppearEffect1); |
| | | PlayAppearEffect(worldPos, fireAppearEffect2); |
| | | //PlayAppearEffect(worldPos, fireAppearEffect2); |
| | | if (Application.platform == RuntimePlatform.WindowsEditor) |
| | | { |
| | | //UnityEditor.EditorApplication.isPaused = true; |
| | |
| | | { |
| | | //木元素 |
| | | PlayAppearEffect(worldPos, woodAppearEffect1); |
| | | PlayAppearEffect(worldPos, woodAppearEffect2); |
| | | //PlayAppearEffect(worldPos, woodAppearEffect2); |
| | | |
| | | } |
| | | else if (towerName.StartsWith("CopyCatTower")) |
| | | { |
| | | //水元素 |
| | | PlayAppearEffect(worldPos, waterAppearEffect1); |
| | | PlayAppearEffect(worldPos, waterAppearEffect2); |
| | | //PlayAppearEffect(worldPos, waterAppearEffect2); |
| | | } |
| | | } |
| | | void PlayAppearEffect(Vector3 worldPos, GameObject prefab) |
| | |
| | | } |
| | | //placeObj = GameObject.FindGameObjectWithTag("PlaceTowerOpponent"); |
| | | EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessHeartAllLose, AllHeartLose); |
| | | EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.PlayBuffPS, PlayBuffPS); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | state = State.Normal; |
| | | m_Camera = GameObject.Find("SceneCamera3D").GetComponent<Camera>(); |
| | | //m_Camera = GameObject.Find("BackCamera").GetComponent<Camera>(); |
| | | |
| | | //m_Camera = GetComponent<Camera>(); |
| | | TowerDestroyArr = new bool[5, AttackRowNumbers]; |
| | | } |
| | |
| | | // WORK START: 从这里开始,移动的时候与场景内的WaveSelEffect射线做碰撞。 |
| | | // Raycast onto placement layer |
| | | PlacementAreaRaycast(ref npt); |
| | | |
| | | //Debug.Log("npt.raycast:" + npt.raycast); |
| | | if (npt.raycast != null) |
| | | { |
| | | MoveGhostWithRaycastHit(npt.raycast.Value); |