Exemplo n.º 1
0
 public void ChangeCoordsAndMove(Vector2Int targetCoords, float speed)
 {
     if (coords.x == targetCoords.x)
     {
         //직선이동
         var pos = BoardUtil.GetPosition(targetCoords);
         ToGoal(pos, speed);
     }
     else
     {
         //곡선이동
         var     mover = GetComponent <Mover>();
         Vector3 via   = GetVia(coords, targetCoords);
         var     des   = new List <Vector3>();
         if (mover.IsMoving())
         {
             des.Add(mover.destination);
         }
         des.Add(via);
         des.Add(BoardUtil.GetPosition(targetCoords));
         mover.speed = speed;
         mover.ToGoal(des);
     }
     coords = targetCoords;
 }
    /// <summary>
    /// 스폰 위치에서 블록을 생성합니다.
    /// </summary>
    /// <param name="blockPrefab">복제할 프리팹</param>
    /// <param name="coords">좌표</param>
    private Block SpawnRandomBlock()
    {
        var randPrefab = prefabs[UnityEngine.Random.Range(0, prefabs.Count)];

        if (randPrefab.type == BlockType.Top)
        {
            if (remainTopCount > 0)
            {
                remainTopCount--;
            }
            else
            {
                return(SpawnRandomBlock());
            }
        }

        Vector2Int spawnCoords = new Vector2Int(Global.MAX_SIZE.x / 2, Global.MAX_SIZE.y - 1);

        if (blocks.Exists(x => x.coords == spawnCoords))
        {
            throw new Exception("같은 위치에 블록이 있음");
        }

        var block = Instantiate(randPrefab);

        block.coords = spawnCoords;
        block.transform.SetParent(transform, false);
        block.transform.position = BoardUtil.GetPosition(spawnCoords) + new Vector3(0f, 3f, 0f);
        block.ToGoal(BoardUtil.GetPosition(spawnCoords), Global.BLOCK_DROP_SPEED);
        blocks.Add(block);
        return(block);
    }
    private Board CreateBoard(Vector2Int coords)
    {
        var board = Instantiate(boardPrefab);

        board.coords = coords;
        board.transform.SetParent(transform, false);
        board.transform.position = BoardUtil.GetPosition(board.coords);
        return(board);
    }
Exemplo n.º 4
0
    private Vector3 GetVia(Vector2Int startCoords, Vector2Int targetCoords)
    {
        var       coords = startCoords;
        int       count  = Mathf.Abs(targetCoords.x - startCoords.x);
        Direction dir    = Direction.LeftDown;

        if (startCoords.x < targetCoords.x)
        {
            dir = Direction.RightDown;
        }
        for (int i = 0; i < count; i++)
        {
            coords = BoardUtil.GetNeighbor(coords, dir);
        }
        return(BoardUtil.GetPosition(coords));
    }
    /// <summary>
    /// 해당 좌표에 블록을 즉시 생성합니다.
    /// </summary>
    /// <param name="blockPrefab">복제할 프리팹</param>
    /// <param name="coords">좌표</param>
    private Block CreateBlock(Block blockPrefab, Vector2Int coords)
    {
        if (!BoardManager.instance.IsEnable(coords))
        {
            throw new Exception("유효범위 초과");
        }
        if (blocks.Exists(x => x.coords == coords))
        {
            throw new Exception("같은 위치에 블록이 있음");
        }

        var block = Instantiate(blockPrefab);

        block.coords = coords;
        block.transform.SetParent(transform, false);
        block.transform.position = BoardUtil.GetPosition(block.coords);
        blocks.Add(block);
        return(block);
    }
    public IEnumerator CoSwapBlock(Block blockA, Block blockB)
    {
        if (blockA.coords == blockB.coords)
        {
            throw new Exception("같은 블록 지정 불가");
        }
        Debug.Log($"Swap ({blockA.coords} , {blockB.coords})");
        backUpBlock[0] = blockA;
        backUpBlock[1] = blockB;
        //이동
        blockA.ToGoal(BoardUtil.GetPosition(blockB.coords), Global.BLOCK_SWAP_SPEED);
        blockB.ToGoal(BoardUtil.GetPosition(blockA.coords), Global.BLOCK_SWAP_SPEED);
        yield return(new WaitUntil(() => !blockA.IsMoving() && !blockB.IsMoving()));

        //실제 좌표변경
        Vector2Int temp = blockA.coords;

        blockA.coords = blockB.coords;
        blockB.coords = temp;
    }