Example #1
0
    public override void StartState()
    {
        base.StartState();
        Debug.Log("[" + _cCharacter.name + "]Player move Start State");
        pathState = ePathState.PATH_FIND;

        _cCharacter.GetAnimator().SetBool("isMoving", true);

        _cCharacter.ClearPathFindQueue();
        _cCharacter.ClearPathStack();
        GameManager.gameInstance.ResetTilePath(_cCharacter.name);

        Debug.Log("[" + _cCharacter.name + "]Move target : " + _cCharacter.GetMoveTarget().GetTilePosition());
        FindPath(_cCharacter.GetMoveTarget().GetTilePosition());
    }
Example #2
0
    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;
            }
        }
    }