public void PlayQuakeAnimation(int x, int y, int radius, float addDelay = 0) { if (Time.realtimeSinceStartup < quakeAnimationCooldown) { return; } var calculatedTotalDurationOfAnimation = ((radius * 0.25f) * 0.5f) + 0.75f; quakeAnimationCooldown = Time.realtimeSinceStartup + calculatedTotalDurationOfAnimation; var center = new Vector2(x, y); var current = Vector2.zero; for (int y2 = y - radius; y2 <= y + radius; y2++) { for (int x2 = x - radius; x2 <= x + radius; x2++) { if (x2 < 0 || x2 >= LevelData.Width || y2 < 0 || y2 >= LevelData.Height) { continue; } current.x = x2; current.y = y2; var distance = Vector2.Distance(current, center); if (distance <= radius) { var tile = LevelData.Tiles[x2, y2].transform; var originalY = tile.position.y; var delay = addDelay + (distance * 0.25f) * 0.5f; var sequence = DOTween.Sequence(); sequence.PrependInterval(delay); sequence.Append(tile.DOLocalMoveY(originalY + 0.1f, 0.25f).SetEase(Ease.OutBack)); sequence.Append(tile.DOLocalMoveY(originalY - 0.1f, 0.25f).SetEase(Ease.OutBack)); sequence.Append(tile.DOLocalMoveY(originalY, 0.25f)); for (int i = 0; i < LevelData.Entities.Count; i++) { var entity = LevelData.Entities[i]; if (entity.gameObject.activeSelf && entity.GridPosition == current) { var sequence2 = DOTween.Sequence(); sequence2.PrependInterval(delay); var entityTransform = entity.gameObject.transform; sequence2.Append(entityTransform.DOLocalMoveY(originalY + 0.1f, 0.25f).SetEase(Ease.OutBack)); sequence2.Append(entityTransform.DOLocalMoveY(originalY - 0.1f, 0.25f).SetEase(Ease.OutBack)); sequence2.Append(entityTransform.DOLocalMoveY(originalY, 0.25f)); } } } } } audio.PlayQuake(); }