protected override void Awake() { base.Awake(); selection = Instantiate(selection); selection.transform.localScale = new Vector3(GridManager.PIECE_WIDTH, GridManager.PIECE_WIDTH, GridManager.PIECE_WIDTH); nextBombSpawnScore = bombInterval; inputReceiver.ClickEvent += OnClick; inputReceiver.SwipeEvent += OnSwipe; }
// Rotate the selected hexagon pieces on the grid around the center point by degrees public IEnumerator RotateSelection(TupleSelection selection, float degrees) { Quaternion currentAngles = Quaternion.Euler(selection.transform.localEulerAngles); Vector3 initialRotation = new Vector3(); Vector3 targetRotation = new Vector3(0f, 0f, degrees); HexagonPiece piece1 = selection.Tuple.piece1; HexagonPiece piece2 = selection.Tuple.piece2; HexagonPiece piece3 = selection.Tuple.piece3; // Rotation happens by rotation the direction vectors Vector3 selectionCenter = selection.transform.localPosition; Vector3 dir1 = piece1.transform.localPosition - selectionCenter; Vector3 dir2 = piece2.transform.localPosition - selectionCenter; Vector3 dir3 = piece3.transform.localPosition - selectionCenter; float t = 0f; float tMultiplier = selectionRotateSpeed / Mathf.Abs(degrees); while ((t = t + Time.deltaTime * tMultiplier) < 1f) { // Using Quaternion.LerpUnclamped applies no rotation for degrees=360, this is actually smart but not desirable in this case Quaternion rotation = Quaternion.Euler(Vector3.LerpUnclamped(initialRotation, targetRotation, t)); selection.transform.localRotation = currentAngles * rotation; piece1.transform.localPosition = selectionCenter + rotation * dir1; piece2.transform.localPosition = selectionCenter + rotation * dir2; piece3.transform.localPosition = selectionCenter + rotation * dir3; yield return(null); } // Can't rely on floating point precision, rotated pieces may deviate from their intended positions after a number of turns, // put the rotated pieces at their exact position after the rotation is complete selection.transform.localRotation = currentAngles * Quaternion.Euler(targetRotation); piece1.transform.localPosition = GridManager.Instance[piece1.X].CalculatePositionAt(piece1.Y); piece2.transform.localPosition = GridManager.Instance[piece2.X].CalculatePositionAt(piece2.Y); piece3.transform.localPosition = GridManager.Instance[piece3.X].CalculatePositionAt(piece3.Y); }