void Start() { triGrid = GetComponent <TriGrid>(); var blockSize = triGrid.cellSize * 4; var gridSize = triGrid.gridSize; this.gameObject.layer = LayerMask.NameToLayer("PuzzleBoard"); var collider = this.gameObject.AddComponent <BoxCollider2D>(); var colliderSize = CoordsUtils.OrthoToSlope(new Vector2(blockSize * gridSize.x, blockSize * gridSize.y)); collider.size = colliderSize * 2; collider.offset = colliderSize / 2f; LoadPuzzle(puzzleId); }
// Start is called before the first frame update void Start() { GameObject grid = new GameObject(); grid.name = "grid"; triGrid = grid.AddComponent <TriGrid>(); triGrid.gridSize = new Vector2Int(1, 1); triGrid.blocks = new TriBlock[] { shape }; triGrid.cellPrefab = cellPrefab; triGrid.cellSize = cellSize; grid.transform.SetParent(transform, false); grid.transform.localPosition = Vector3.zero; this.gameObject.layer = LayerMask.NameToLayer("PuzzlePiece"); var collider = gameObject.AddComponent <BoxCollider2D>(); float blockSize = cellSize * 4f; var colliderSize = CoordsUtils.OrthoToSlope(new Vector2(blockSize, blockSize)); collider.size = colliderSize; collider.offset = colliderSize / 2f; }
void Start() { triCells = new TriCell[blocks.Length, 16]; float blockSize = cellSize * 4; for (int y = 0; y < gridSize.y; y++) { for (int x = 0; x < gridSize.x; x++) { Vector2 origin = new Vector2(x, y) * blockSize; origin = CoordsUtils.OrthoToSlope(origin); GameObject blockObj = new GameObject(); blockObj.name = "block" + x + "," + y; blockObj.transform.SetParent(transform, false); blockObj.transform.localPosition = origin; blockObj.hideFlags = HideFlags.DontSave; int index = y * gridSize.x + x; TriBlock block = blocks[index]; for (int i = 0; i < 16; i++) { int ix = i % 4; int iy = i / 4; uint mask = invert ? ~block.mask : block.mask; uint cellMask = mask >> (i * 2) & 3; GameObject cell = Instantiate <GameObject>(cellPrefab); cell.name = "cell" + i; cell.transform.SetParent(blockObj.transform, false); var cellPos = CoordsUtils.OrthoToSlope(new Vector2(ix, iy) * cellSize); cell.transform.localPosition = cellPos; var triCell = cell.GetComponent <TriCell>(); triCell.UpdatePresentation(cellMask); triCells[index, i] = triCell; } } } }
void Update() { var mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0)); if (Input.GetButtonDown("Fire1")) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit = Physics2D.GetRayIntersection(ray, Mathf.Infinity, LayerMask.GetMask("PuzzlePiece")); var hitTarget = hit.collider?.gameObject; puzzlePiece = hitTarget?.GetComponent <PuzzlePiece>(); if (puzzlePiece != null) { if (!puzzlePiece.canMove) { var go = Instantiate(puzzlePiece.selfPrefab); var prevPuzzle = puzzlePiece; var mask = puzzlePiece.shape.mask; go.transform.position = puzzlePiece.transform.position; puzzlePiece = go.GetComponent <PuzzlePiece>(); puzzlePiece.shape.mask = mask; puzzlePiece.variations = prevPuzzle.variations; puzzlePiece.selfPrefab = prevPuzzle.selfPrefab; puzzlePiece.canMove = true; puzzlePiece.selected = true; } offset = puzzlePiece.transform.position - mousePos; originalPos = puzzlePiece.transform.position; ItemSlots.Instance.DescreaseCount(puzzlePiece.id); } } if (Input.GetButton("Fire1")) { if (puzzlePiece != null) { puzzlePiece.transform.position = mousePos + offset; } } if (Input.GetButtonUp("Fire1")) { if (puzzlePiece != null) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit = Physics2D.GetRayIntersection(ray, Mathf.Infinity, LayerMask.GetMask("PuzzleBoard")); var hitTarget = hit.collider?.gameObject; var grid = hitTarget?.GetComponent <TriGrid>(); var puzzleBoard = hitTarget?.GetComponent <PuzzleBoard>(); if (grid != null && puzzleBoard != null) { Vector2 relativePos = new Vector2(puzzlePiece.transform.position.x, puzzlePiece.transform.position.y) - new Vector2(grid.transform.position.x, grid.transform.position.y); Vector2 orthoPos = CoordsUtils.SlopeToOrtho(relativePos) / grid.cellSize; Debug.Log("puzzle: " + puzzlePiece.transform.position + "; grid: " + grid.transform.position); Vector2Int gridOffset = new Vector2Int(Mathf.RoundToInt(orthoPos.x), Mathf.RoundToInt(orthoPos.y)); bool canFit = grid.CanFit(gridOffset.x, gridOffset.y, puzzlePiece.shape); bool isOutOfBound = grid.IsOutOfBound(gridOffset.x, gridOffset.y); Debug.Log("canFit: " + canFit + ", isOutOfBound: " + isOutOfBound + " gridOffset: " + gridOffset); if (canFit && !isOutOfBound) { puzzleBoard.Attach(gridOffset.x, gridOffset.y, puzzlePiece.shape); ClinicManager.instance.MedicinesCost[puzzlePiece.id] += 1; } } Destroy(puzzlePiece.gameObject); } } }