TripleSplitEffect.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using UnityEngine;
  2. public class TripleSplitEffect : BallEffectBase
  3. {
  4. private bool _hasSplit;
  5. private TripleSplitEffectDefinition Config => definition as TripleSplitEffectDefinition;
  6. public override void OnBallReset(BallScript ball)
  7. {
  8. _hasSplit = false;
  9. }
  10. public override void OnHitBlock(BallScript ball, blockScript block, Collision2D collision)
  11. {
  12. TripleSplitEffectDefinition config = Config;
  13. if (config == null)
  14. return;
  15. if (config.SplitOnlyOnce && _hasSplit)
  16. return;
  17. _hasSplit = true;
  18. Vector2 currentDir = collision.rigidbody != null
  19. ? collision.rigidbody.linearVelocity.normalized
  20. : Vector2.up;
  21. // Spawn two additional balls at +/- splitAngle around current direction.
  22. Vector2 dirA = Rotate(currentDir, config.SplitAngle);
  23. Vector2 dirB = Rotate(currentDir, -config.SplitAngle);
  24. BallScript cloneA = ball.SpawnClone(dirA, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier);
  25. BallScript cloneB = ball.SpawnClone(dirB, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier);
  26. // The original ball becomes one of the 3 child balls.
  27. ball.MultiplyScale(config.ChildScaleMultiplier);
  28. ball.MultiplyDamage(config.ChildDamageMultiplier);
  29. if (config.SplitOnlyOnce)
  30. {
  31. MarkAsAlreadySplit(cloneA);
  32. MarkAsAlreadySplit(cloneB);
  33. }
  34. }
  35. private static void MarkAsAlreadySplit(BallScript cloneBall)
  36. {
  37. if (cloneBall == null)
  38. return;
  39. TripleSplitEffect cloneEffect = cloneBall.GetComponent<TripleSplitEffect>();
  40. if (cloneEffect != null)
  41. cloneEffect._hasSplit = true;
  42. }
  43. private static Vector2 Rotate(Vector2 v, float degrees)
  44. {
  45. float rad = degrees * Mathf.Deg2Rad;
  46. float sin = Mathf.Sin(rad);
  47. float cos = Mathf.Cos(rad);
  48. return new Vector2(v.x * cos - v.y * sin, v.x * sin + v.y * cos).normalized;
  49. }
  50. }