HomingEffect.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using UnityEngine;
  2. public class HomingEffect : BallEffectBase
  3. {
  4. private float _retargetTimer;
  5. private blockScript _targetBlock;
  6. private HomingEffectDefinition Config => definition as HomingEffectDefinition;
  7. public override void OnBallReset(BallScript ball)
  8. {
  9. _retargetTimer = 0f;
  10. _targetBlock = null;
  11. }
  12. public override void ModifyVelocity(BallScript ball, ref Vector2 velocity, float deltaTime)
  13. {
  14. HomingEffectDefinition config = Config;
  15. if (config == null)
  16. return;
  17. if (velocity.sqrMagnitude < 0.0001f)
  18. return;
  19. _retargetTimer += deltaTime;
  20. if (_targetBlock == null || _retargetTimer >= config.RetargetInterval)
  21. {
  22. _retargetTimer = 0f;
  23. _targetBlock = FindClosestBlock(ball.transform.position);
  24. }
  25. if (_targetBlock == null)
  26. return;
  27. Vector2 currentDir = velocity.normalized;
  28. Vector2 targetDir = ((Vector2)_targetBlock.transform.position - (Vector2)ball.transform.position).normalized;
  29. float maxRadians = config.TurnRateDegreesPerSecond * Mathf.Deg2Rad * deltaTime;
  30. Vector3 steered = Vector3.RotateTowards(currentDir, targetDir, maxRadians, 0f);
  31. velocity = ((Vector2)steered).normalized * velocity.magnitude;
  32. }
  33. private static blockScript FindClosestBlock(Vector2 position)
  34. {
  35. blockScript[] blocks = FindObjectsByType<blockScript>(FindObjectsSortMode.None);
  36. blockScript best = null;
  37. float bestSqrDistance = float.MaxValue;
  38. for (int i = 0; i < blocks.Length; i++)
  39. {
  40. blockScript b = blocks[i];
  41. if (b == null)
  42. continue;
  43. float sqrDist = ((Vector2)b.transform.position - position).sqrMagnitude;
  44. if (sqrDist < bestSqrDistance)
  45. {
  46. bestSqrDistance = sqrDist;
  47. best = b;
  48. }
  49. }
  50. return best;
  51. }
  52. }