public IEnumerator OnTileClicked(Tile tile) { if (_isMoving) { yield break; } if (!IsTileMovable(tile)) { yield break; } // // Move is valid. Change stuff here // tile.PlaySfx(PlayerRowIndex); int amountOfMovement = Mathf.Abs(tile.Index.i - PlayerRowIndex); PlayerRowIndex = tile.Index.i; PlayerColumnIndex = tile.Index.j; GameUi.SetDepth(PlayerRowIndex, Direction); // if (!OnReturnStage) // { // Score += (PlayerRowIndex + 1); // GameUi.SetScore(Score, (PlayerRowIndex + 1), ScoreType.Depth); // } // // Tile special effect // if (tile.Type == TileType.Water) { // No Effect on water } else if (tile.Type == TileType.Oxygen) { Oxygen += 2; Oxygen = Mathf.Clamp(Oxygen, 0, MaxOxygen + 1); } else if (tile.Type == TileType.Shark) { Oxygen -= 1; Oxygen = Mathf.Clamp(Oxygen, 0, MaxOxygen + 1); } else if (tile.Type == TileType.Gem) { Score += 1; GameUi.SetScore(Score, 1, ScoreType.Gem); } else if (tile.Type == TileType.End) { Score += 1; GameUi.SetScore(Score, 1, ScoreType.Gem); } else { Debug.LogError("Tile Type not found"); } // // Oxygen decrease due to depth // Oxygen--; GameUi.SetOxygen(Oxygen); Player.HandleExclamation(Oxygen, Direction); Vector3 playerSrc = Player.transform.position; Vector3 playerTarget = tile.transform.position; if (tile.Index.i >= 0 && tile.Index.j >= 0) { _tiles[tile.Index.i][tile.Index.j] = null; } Destroy(tile.gameObject); // // First, move the player to the target tile // _isMoving = true; const float moveDuration = 0.5f; // Set bubble particles // BubbleTrail.Play(); // BubbleTrail.simulationSpace = ParticleSystemSimulationSpace.World; // ParticleSystem.ShapeModule shape = BubbleTrail.shape; // shape.position = // // CoroutineStarter.RunDelayed(moveDuration, () => BubbleTrail.simulationSpace = ParticleSystemSimulationSpace.Local); CoroutineStarter.Run(Player.PlayMoveAnim(moveDuration, Direction)); yield return(Curve.Tween(MoveCurve, moveDuration, t => { Player.transform.position = Vector3.Lerp(playerSrc, playerTarget, t); })); // // Then, move these upwards // - Tiles // - Player // - Background // const float spaceBetweenTiles = 1.5f; Vector3 scrollAmount = (Direction == GameDirection.Up ? Vector3.up : Vector3.down) * spaceBetweenTiles * amountOfMovement; Vector3 cameraSrc = CameraTransform.position; Vector3 cameraTarget = cameraSrc + scrollAmount; Curve.Tween(MoveCurve, moveDuration, t => { CameraTransform.position = Vector3.Lerp(cameraSrc, cameraTarget, t); }, () => { CameraTransform.position = cameraTarget; }); // Generate new row for (int j = 0; j < amountOfMovement; j++) { var newRow = TileGenerator.GenerateRow(ColumnCount); for (int i = 0; i < ColumnCount; i++) { newRow[i].Index = (_tiles.Count, i); newRow[i].transform.localPosition = new Vector3(i * OffsetBetweenTiles, _tiles.Count * -1 * OffsetBetweenTiles, 0); } _tiles.Add(newRow); } yield return(new WaitForSeconds(moveDuration)); Player.transform.position = playerTarget; _isMoving = false; if (PlayerRowIndex > ShowReturnButtonAt && !OnReturnStage) { GameUi.ShowReturnButton(); } if (PlayerRowIndex < 0 && OnReturnStage) { _isMoving = true; string playerName = PlayerPrefs.GetString("Name"); dreamloLeaderBoard.GetSceneDreamloLeaderboard().AddScore(playerName, PlayerCurrentDepthRecord * 1000 + Score); ResultData.Instance.HasWon = true; ResultData.Instance.Score = Score; ResultData.Instance.Depth = PlayerCurrentDepthRecord; GameUi.CloseFlash(); } else if (Oxygen <= 0) { _isMoving = true; ResultData.Instance.HasWon = false; Player.transform.DetachChildren(); Sfx.Instance.Play("Lose2"); CoroutineStarter.Run(Player.PlayDeadAnim(1.9f, Direction)); GameUi.CloseFlash(); } }