コード例 #1
0
    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();
        }
    }
コード例 #2
0
    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);
    }
コード例 #3
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;
            }
        }
    }
コード例 #4
0
 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()));
             }
         }
     }
 }
コード例 #5
0
    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;
    }
コード例 #6
0
    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;
            }
        }
    }
コード例 #7
0
 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));
                     }
                 }
             }
         }
     }
 }