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); }
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; }