public static IEnumerator SelectSkillApplyPoint(BattleData battleData, Direction originalDirection) { Direction beforeDirection = originalDirection; Unit selectedUnit = battleData.selectedUnitObject.GetComponent <Unit>(); while (battleData.currentState == CurrentState.SelectSkillApplyPoint) { Vector2 selectedUnitPos = battleData.selectedUnitObject.GetComponent <Unit>().GetPosition(); List <GameObject> activeRange = new List <GameObject>(); Skill selectedSkill = battleData.SelectedSkill; activeRange = battleData.tileManager.GetTilesInRange(selectedSkill.GetFirstRangeForm(), selectedUnitPos, selectedSkill.GetFirstMinReach(), selectedSkill.GetFirstMaxReach(), battleData.selectedUnitObject.GetComponent <Unit>().GetDirection()); Tile selectedTile = UdongNoodle.FindEnemyTile(activeRange, battleData.selectedUnitObject); if (selectedTile == null) { // 아무것도 할 게 없을 경우 휴식 battleData.currentState = CurrentState.RestAndRecover; yield return(battleData.battleManager.StartCoroutine(RestAndRecover.Run(battleData))); yield break; } // activeRange[Random.Range(0, activeRange.Count)].GetComponent<Tile>(); battleData.selectedTilePosition = selectedTile.GetTilePos(); // 타겟팅 스킬을 타겟이 없는 장소에 지정했을 경우 적용되지 않도록 예외처리 필요 - 대부분의 스킬은 논타겟팅. 추후 보강. BattleManager battleManager = battleData.battleManager; battleData.currentState = CurrentState.CheckApplyOrChain; List <GameObject> tilesInSkillRange = GetTilesInSkillRange(battleData, selectedTile); yield return(SkillAndChainStates.ApplyChain(battleData, tilesInSkillRange)); FocusUnit(battleData.SelectedUnit); battleData.currentState = CurrentState.FocusToUnit; yield return(battleManager.StartCoroutine(SkillAndChainStates.CheckApplyOrChain(battleData, battleData.SelectedTile, originalDirection))); } }
public static IEnumerator AIMove(BattleData battleData) { BattleManager battleManager = battleData.battleManager; yield return(battleManager.StartCoroutine(AIDIe(battleData))); Dictionary <Vector2, TileWithPath> movableTilesWithPath = PathFinder.CalculatePath(battleData.selectedUnitObject); List <GameObject> movableTiles = new List <GameObject>(); foreach (KeyValuePair <Vector2, TileWithPath> movableTileWithPath in movableTilesWithPath) { movableTiles.Add(movableTileWithPath.Value.tile); } battleData.uiManager.UpdateApBarUI(battleData, battleData.unitManager.GetAllUnits()); // var randomPosition = movableTiles[Random.Range(0, movableTiles.Count)].GetComponent<Tile>().GetTilePos(); var randomPosition = UdongNoodle.FindNearestEnemy(movableTiles, battleData.unitManager.GetAllUnits(), battleData.selectedUnitObject); // FIXME : 어딘가로 옮겨야 할 텐데... GameObject destTile = battleData.tileManager.GetTile(randomPosition); List <GameObject> destPath = movableTilesWithPath[randomPosition].path; Vector2 currentTilePos = battleData.selectedUnitObject.GetComponent <Unit>().GetPosition(); Vector2 distanceVector = randomPosition - currentTilePos; int distance = (int)Mathf.Abs(distanceVector.x) + (int)Mathf.Abs(distanceVector.y); int totalUseActivityPoint = movableTilesWithPath[randomPosition].requireActivityPoint; // battleData.moveCount += distance; // battleData.tileManager.DepaintTiles(movableTiles, TileColor.Blue); battleData.currentState = CurrentState.CheckDestination; List <GameObject> destTileList = destPath; destTileList.Add(destTile); // 카메라를 옮기고 Camera.main.transform.position = new Vector3(destTile.transform.position.x, destTile.transform.position.y, -10); battleData.currentState = CurrentState.MoveToTile; yield return(battleManager.StartCoroutine(MoveStates.MoveToTile(battleData, destTile, Direction.Right, totalUseActivityPoint))); yield return(AIAttack(battleData)); }