private ChessCharacter FindAdjacentTarget(int findRange) { _cCharacter.ClearPathFindQueue(); GameManager.gameInstance.ResetTilePath(_cCharacter.name); ChessTile startTile; startTile = GameManager.gameInstance.tilemap.GetTile <ChessTile>(_cCharacter.GetTilePosition()); startTile.SetPrevPathTileNodeMap(_cCharacter.name, startTile); _cCharacter.PushPathFindTile(startTile); ChessTile nextQueueTile = _cCharacter.PopPathFindTile(); while (nextQueueTile != null) //###남은 갯수 체크가 아닌 PopPathFindTile 반환 값으로 판별하도록 개선 가능 { ChessTile currentTile = nextQueueTile; //가장 인근의 캐릭터 반환 if (currentTile.gameObject != null && currentTile.GetDistanceWeight() != 0) { ChessCharacter targetCharacter = currentTile.gameObject.GetComponent <ChessCharacter>(); if (_cCharacter.GetCharacterType() != targetCharacter.GetCharacterType() && targetCharacter.GetCharacterType() != ChessCharacter.eCharacterType.WAIT) // 적일 때만 탐색 성공 시킨다. { return(targetCharacter); } } else if (currentTile.GetDistanceWeight() == findRange + 1) { return(null); } else { for (int i = 0; i < (int)ChessCharacter.Direction.MAXSIZE; i++) { ChessCharacter.Direction direction = (ChessCharacter.Direction)i; Vector3Int nextTilePos = currentTile.GetTilePosition() + _cCharacter.GetDirectionTileNext(direction); ChessTile nextTile = GameManager.gameInstance.tilemap.GetTile <ChessTile>(nextTilePos); if (_cCharacter.IsInWall(nextTilePos) && //맵 안에 있을 때 분기 nextTile.GetPrevPathTileNodeMap(_cCharacter.name) == null) // 이미 이전 타일 세팅 안되있을 때 분기 { nextTile.SetPrevPathTileNodeMap(_cCharacter.name, currentTile); nextTile.SetDistanceWeight(currentTile.GetDistanceWeight() + 1); _cCharacter.PushPathFindTile(nextTile); } } } nextQueueTile = _cCharacter.PopPathFindTile(); } return(null); }
private void FindPath(Vector3Int targetTilePosition) { _cCharacter.ClearPathFindQueue(); _cCharacter.ClearPathStack(); GameManager.gameInstance.ResetTilePath(_cCharacter.name); ChessTile startTile; startTile = GameManager.gameInstance.tilemap.GetTile <ChessTile>(_cCharacter.GetTilePosition()); startTile.SetPrevPathTileNodeMap(_cCharacter.name, startTile); _cCharacter.PushPathFindTile(startTile); ChessTile nextQueueTile = _cCharacter.PopPathFindTile(); while (nextQueueTile != null) { ChessTile currentTile = nextQueueTile; //목표 타일에 도달하면 반환 if (currentTile.GetTilePosition() == targetTilePosition) { ChessTile pathTile = currentTile; while (pathTile.GetPrevPathTileNodeMap(_cCharacter.name) != null && pathTile.GetPrevPathTileNodeMap(_cCharacter.name) != pathTile) { _cCharacter.PushPathStackTile(pathTile); pathTile = pathTile.GetPrevPathTileNodeMap(_cCharacter.name); targetTile = pathTile; } Debug.Log("@@@@@path finish1!!!"); return; } else { for (int i = 0; i < (int)ChessCharacter.Direction.MAXSIZE; i++) { ChessCharacter.Direction direction = (ChessCharacter.Direction)i; Vector3Int nextTilePos = currentTile.GetTilePosition() + _cCharacter.GetDirectionTileNext(direction); ChessTile nextTile = GameManager.gameInstance.tilemap.GetTile <ChessTile>(nextTilePos); if (_cCharacter.IsInWall(nextTilePos) && nextTile.GetPrevPathTileNodeMap(_cCharacter.name) == null) { nextTile.SetPrevPathTileNodeMap(_cCharacter.name, currentTile); //Debug.Log("nextTile : " + nextTile.position + "direction : " + direction); _cCharacter.PushPathFindTile(nextTile); } } } nextQueueTile = _cCharacter.PopPathFindTile(); } }
public override void UpdateState() { base.UpdateState(); if (pathState == ePathState.PATH_FIND) { Debug.Log("[" + _cCharacter.name + "]ePathState.PATH_FIND"); // 경로대로 이동 종료 if (_cCharacter.GetTilePosition() == _cCharacter.GetMoveTarget().GetTilePosition()) //목표 == 현재 내 위치일 때 { Debug.Log("[" + _cCharacter.name + "] 목표 도착"); _cCharacter.SetState(ChessCharacter.eState.IDLE); return; } if (targetTile.GetTilePosition() != _cCharacter.GetTilePosition()) { Debug.Log("적 위치 변경으로 재탐색"); _cCharacter.SetState(ChessCharacter.eState.IDLE); return; } //경로 상의 다음 타일 세팅 aimTile = _cCharacter.PopPathStackTile(); if (aimTile != null && _cCharacter.CanMoveTile(aimTile.GetTilePosition())) { //Debug.Log("ePathState.PATH_FIND canMove"); //이동 방향 설정 Vector3Int dirctionVector = aimTile.GetTilePosition() - _cCharacter.GetTilePosition(); ChessCharacter.Direction direction = ChessCharacter.Direction.RIGHT; if (dirctionVector == Vector3Int.up) { direction = ChessCharacter.Direction.UP; } else if (dirctionVector == Vector3Int.down) { direction = ChessCharacter.Direction.DOWN; } else if (dirctionVector == Vector3Int.left) { direction = ChessCharacter.Direction.LEFT; } else if (dirctionVector == Vector3Int.right) { direction = ChessCharacter.Direction.RIGHT; } _cCharacter.SetDirection(direction); //이동하는 타일로 캐릭 정보 이동 GameManager.gameInstance.tilemap.SetColliderType(_cCharacter.GetTilePosition(), Tile.ColliderType.None); GameManager.gameInstance.SetTileObject(_cCharacter.GetTilePosition(), null); _cCharacter.SetTilePosition(aimTile.GetTilePosition()); pathState = ePathState.PATH_MOVE; } else { Debug.Log("ePathState.PATH_FIND can't Move"); // 다음 이동 타일에 배치된 오브젝트 있으면 그 대상 공격하기 if (aimTile != null && aimTile.gameObject != null) { ChessCharacter attackTargetCharacter = aimTile.gameObject.GetComponent <ChessCharacter>(); if (attackTargetCharacter != null) { if (_cCharacter.GetCharacterType() != attackTargetCharacter.GetCharacterType() && attackTargetCharacter.GetCharacterType() != ChessCharacter.eCharacterType.WAIT) // 적일 때만 공격 시킨다. { _cCharacter.SetAttackTarget(attackTargetCharacter); _cCharacter.SetState(ChessCharacter.eState.ATTACK); } } } else { _cCharacter.SetState(ChessCharacter.eState.IDLE); } } } else if (pathState == ePathState.PATH_MOVE) { //Debug.Log("ePathState.PATH_MOVE"); //현재 타일 > 다음 타일로의 이동 Vector3 aimPosition = GameManager.gameInstance.tilemap.layoutGrid.CellToWorld(aimTile.GetTilePosition()); _cCharacter.transform.position = Vector3.MoveTowards(_cCharacter.transform.position, aimPosition, _cCharacter.moveSpeed * Time.deltaTime); if (Vector3.Distance(_cCharacter.transform.position, aimPosition) == 0.0f) { pathState = ePathState.PATH_FIND; } } }