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(); } }
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); }
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; } } }
public void AllTilesLog() { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { ChessTile chessTile = tilemap.GetTile <ChessTile>(new Vector3Int(j, i, 0)); if (chessTile != null) { Debug.Log("tile[" + j + "," + i + "] : " + tilemap.GetColliderType(chessTile.GetTilePosition())); } } } }
void Start() { Debug.Log("Start GameManager!!!"); //BGM, SE 오브젝트 읽어오기 bgm = GameObject.Find("BGM").GetComponent <AudioSource>(); se = GameObject.Find("SE").GetComponent <AudioSource>(); bgm.clip = waitBgm; bgm.Play(); //타일 객체들 생성(타일 위 오브젝트 관리를 위해서...) for (int i = -1; i < 8; i++) //-1은 체스말 대기 위치 { //tileCharacters.Add(new List<ChessTile>()); for (int j = 0; j < 8; j++) { ChessTile chessTile = ScriptableObject.CreateInstance <ChessTile>(); if (tilemap.GetTile(new Vector3Int(j, i, 0))) { chessTile.sprite = Resources.Load <Sprite>("Blocks/" + tilemap.GetTile(new Vector3Int(j, i, 0)).name); } chessTile.colliderType = Tile.ColliderType.None; chessTile.SetTilePosition(new Vector3Int(j, i, 0)); tilemap.SetTile(chessTile.GetTilePosition(), chessTile); } } //캐릭터 구매 UI 초기화(제거 예정) resetBtn.onClick.AddListener(() => { { SetBuySlot(buySlot1, GetRandomCharacter()); SetBuySlot(buySlot2, GetRandomCharacter()); SetBuySlot(buySlot3, GetRandomCharacter()); SetBuySlot(buySlot4, GetRandomCharacter()); } }); //최신 플레이어 배치 리스트 저장 lastPlayerNameList = new List <sSpawnCharacter>(); currentRound = 1; //round 별 적 데이터 저장 roundEnemyList = new Dictionary <int, List <sSpawnCharacter> >(); roundEnemyList[1] = new List <sSpawnCharacter>(); roundEnemyList[1].Add(GetSpawnCharacterInfo(eCharacter.ROYALKNIGHT, 2, 4)); //roundEnemyList[1].Add(GetSpawnCharacterInfo(eCharacter.ROYALKNIGHT, 2, 5)); //roundEnemyList[1].Add(GetSpawnCharacterInfo(eCharacter.SKELETON, 5, 4)); //roundEnemyList[1].Add(GetSpawnCharacterInfo(eCharacter.SKELETON, 5, 5)); roundEnemyList[2] = new List <sSpawnCharacter>(); roundEnemyList[2].Add(GetSpawnCharacterInfo(eCharacter.WORM, 0, 7)); roundEnemyList[2].Add(GetSpawnCharacterInfo(eCharacter.WORM, 1, 7)); roundEnemyList[2].Add(GetSpawnCharacterInfo(eCharacter.WORM, 6, 7)); roundEnemyList[2].Add(GetSpawnCharacterInfo(eCharacter.WORM, 7, 6)); roundEnemyList[2].Add(GetSpawnCharacterInfo(eCharacter.WORM, 7, 7)); roundEnemyList[3] = new List <sSpawnCharacter>(); roundEnemyList[3].Add(GetSpawnCharacterInfo(eCharacter.TAURUS, 2, 5)); roundEnemyList[3].Add(GetSpawnCharacterInfo(eCharacter.TAURUS, 3, 6)); roundEnemyList[3].Add(GetSpawnCharacterInfo(eCharacter.BLOBMINION, 4, 6)); roundEnemyList[3].Add(GetSpawnCharacterInfo(eCharacter.BLOBMINION, 5, 5)); roundEnemyList[4] = new List <sSpawnCharacter>(); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.DWARF, 2, 4)); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.DWARF, 3, 4)); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.DWARF, 4, 4)); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.DWARF, 5, 4)); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.DWARF, 6, 4)); roundEnemyList[4].Add(GetSpawnCharacterInfo(eCharacter.SANTA, 4, 6)); roundEnemyList[5] = new List <sSpawnCharacter>(); roundEnemyList[5].Add(GetSpawnCharacterInfo(eCharacter.IMP, 6, 7)); roundEnemyList[5].Add(GetSpawnCharacterInfo(eCharacter.IMP, 7, 6)); roundEnemyList[5].Add(GetSpawnCharacterInfo(eCharacter.DARKKNIGHT, 7, 7)); roundMap = new Dictionary <eRound, Round>(); roundMap[eRound.WAIT] = new WaitRound(); roundMap[eRound.BATTLE] = new BattleRound(); roundMap[eRound.FINISH] = new FinishRound(); for (eRound i = 0; i < eRound.MAXSIZE; i++) { roundMap[i].InitState(); } _round = eRound.WAIT; //초기 세팅만 startState 호출(이후 변경으로 인한 내용은 update에서 감지) roundMap[_round].StartState(); _prevRound = _round; }
public void UpdateInput() { if (Input.GetMouseButtonDown(0)) { Vector3Int mouseDownTilePosition = tilemap.layoutGrid.WorldToCell(Camera.main.ScreenToWorldPoint(Input.mousePosition)); //mouseTargetTilePosition의 x,y가 -1씩 되어 있다 원인은 파악하지 못해서 임시 처리 mouseDownTilePosition.x += 1; mouseDownTilePosition.y += 1; mouseDownTilePosition.z = 0; mouseDownTile = tilemap.GetTile <ChessTile>(mouseDownTilePosition); if (mouseDownTile != null) { if (mouseDownTile.gameObject != null) { holdTarget = mouseDownTile.gameObject; mouseDownTile.gameObject = null; } } } //hold 도중 이동처리 if (Input.GetMouseButton(0) && holdTarget != null) { Vector3 mouseWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPosition.x += 0; mouseWorldPosition.y += 0.5f; mouseWorldPosition.z = 0; holdTarget.transform.position = mouseWorldPosition; } if (Input.GetMouseButtonUp(0)) { if (holdTarget != null) { Debug.Log("holdTarget null 아닐때"); Vector3Int mouseUpTilePosition = tilemap.layoutGrid.WorldToCell(Camera.main.ScreenToWorldPoint(Input.mousePosition)); //mouseTargetTilePosition의 x,y가 -1씩 되어 있다 원인은 파악하지 못해서 임시 처리 mouseUpTilePosition.x += 1; mouseUpTilePosition.y += 1; mouseUpTilePosition.z = 0; ChessTile mouseUpTile = tilemap.GetTile <ChessTile>(mouseUpTilePosition); if (mouseUpTile != null) { if (mouseUpTile.GetTilePosition().y >= 0 && mouseUpTile.GetTilePosition().y < 4) // 4x8 배치 되는 기능 구현 { Debug.Log("y : 0 이상"); string[] nameList = holdTarget.name.Split('_'); if (mouseUpTile.gameObject == null) { ChessWaitCharacter chessWaitCharacter = holdTarget.GetComponent <ChessWaitCharacter>(); SpawnCharacter("Prefabs/Character/" + nameList[1], nameList[1] + "(Player)", mouseUpTile.GetTilePosition().x, mouseUpTile.GetTilePosition().y, chessWaitCharacter.GetChessCharacterType(), ChessCharacter.eCharacterType.PLAYER); Destroy(holdTarget); } else { Debug.Log("가는 타일에 기존 캐릭터가 있습니다."); mouseDownTile.gameObject = holdTarget; mouseDownTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseDownTile.GetTilePosition()); } } else if (mouseUpTile.GetTilePosition().y == -1) //대기 타일 내 이동 { Debug.Log("y : -1"); if (mouseUpTile.gameObject == null) // 빈 타일일 때 { mouseUpTile.gameObject = holdTarget; mouseUpTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseUpTile.GetTilePosition()); } else //타일 있을 때 서로의 위치 교체하기 { GameObject tempObject = mouseUpTile.gameObject; mouseUpTile.gameObject = holdTarget; mouseUpTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseUpTile.GetTilePosition()); mouseDownTile.gameObject = tempObject; mouseDownTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseDownTile.GetTilePosition()); } } else //이상한 곳에 이동시키면... 실패시키기 { Debug.Log("y : 예외들"); mouseDownTile.gameObject = holdTarget; mouseDownTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseDownTile.GetTilePosition()); } for (int i = 0; i < 8; i++) { ChessTile waitTile = tilemap.GetTile <ChessTile>(new Vector3Int(i, -1, 0)); if (waitTile != null) { //Debug.Log("waitTile[" + i + "] : " + waitTile.gameObject); } } } else { Debug.Log("y : 예외들2"); mouseDownTile.gameObject = holdTarget; mouseDownTile.gameObject.transform.position = tilemap.layoutGrid.CellToWorld(mouseDownTile.GetTilePosition()); } holdTarget = null; } } }
public void SavePlayerList() { lastPlayerNameList.Clear(); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { ChessTile chessTile = tilemap.GetTile <ChessTile>(new Vector3Int(j, i, 0)); if (chessTile) { if (chessTile.gameObject) { if (chessTile.gameObject.name.Contains("Player")) { ChessCharacter character = chessTile.gameObject.GetComponent <ChessCharacter>(); lastPlayerNameList.Add(GetSpawnCharacterInfo(character.GetChessCharacterType(), chessTile.GetTilePosition().x, chessTile.GetTilePosition().y)); } } } } } }