using UnityEngine; public class TripleSplitEffect : BallEffectBase { private bool _hasSplit; private TripleSplitEffectDefinition Config => definition as TripleSplitEffectDefinition; public override void OnBallReset(BallScript ball) { _hasSplit = false; } public override void OnHitBlock(BallScript ball, blockScript block, Collision2D collision) { TripleSplitEffectDefinition config = Config; if (config == null) return; if (config.SplitOnlyOnce && _hasSplit) return; _hasSplit = true; Vector2 currentDir = collision.rigidbody != null ? collision.rigidbody.linearVelocity.normalized : Vector2.up; // Spawn two additional balls at +/- splitAngle around current direction. Vector2 dirA = Rotate(currentDir, config.SplitAngle); Vector2 dirB = Rotate(currentDir, -config.SplitAngle); BallScript cloneA = ball.SpawnClone(dirA, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier); BallScript cloneB = ball.SpawnClone(dirB, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier); // The original ball becomes one of the 3 child balls. ball.MultiplyScale(config.ChildScaleMultiplier); ball.MultiplyDamage(config.ChildDamageMultiplier); if (config.SplitOnlyOnce) { MarkAsAlreadySplit(cloneA); MarkAsAlreadySplit(cloneB); } } private static void MarkAsAlreadySplit(BallScript cloneBall) { if (cloneBall == null) return; TripleSplitEffect cloneEffect = cloneBall.GetComponent(); if (cloneEffect != null) cloneEffect._hasSplit = true; } private static Vector2 Rotate(Vector2 v, float degrees) { float rad = degrees * Mathf.Deg2Rad; float sin = Mathf.Sin(rad); float cos = Mathf.Cos(rad); return new Vector2(v.x * cos - v.y * sin, v.x * sin + v.y * cos).normalized; } }