| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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<TripleSplitEffect>();
- 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;
- }
- }
|