SFX_PhysicsHomingMissile.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using UnityEngine;
  2. // ReSharper disable once CheckNamespace
  3. namespace QFX.SFX
  4. {
  5. [RequireComponent(typeof(Rigidbody))]
  6. [RequireComponent(typeof(SFX_DistanceCollisionDetector))]
  7. public class SFX_PhysicsHomingMissile : SFX_ControlledObject
  8. {
  9. public float Velocity;
  10. public float LaunchForce;
  11. public float Turn;
  12. public bool FollowTarget;
  13. public Transform TargetTransform;
  14. public Vector3 TargetPosition;
  15. public Vector3 LaunchPosition;
  16. public float FocusOnTargetDelay;
  17. public bool IsDebug;
  18. private Rigidbody _rigidbody;
  19. private bool _isCollided;
  20. private bool _shouldFocusOnTarget;
  21. private SFX_DistanceCollisionDetector m_sfxDistanceCollisionDetector;
  22. private bool _wasCollided;
  23. public override void Run()
  24. {
  25. base.Run();
  26. transform.LookAt(LaunchPosition);
  27. _rigidbody.AddForce((LaunchPosition - transform.position).normalized * LaunchForce, ForceMode.Impulse);
  28. SFX_InvokeUtil.RunLater(this, () => { _shouldFocusOnTarget = true; }, FocusOnTargetDelay);
  29. }
  30. private void Awake()
  31. {
  32. _rigidbody = GetComponent<Rigidbody>();
  33. m_sfxDistanceCollisionDetector = GetComponent<SFX_DistanceCollisionDetector>();
  34. var collisionProviders = GetComponents<SFX_ICollisionsProvider>();
  35. foreach (var collisionsProvider in collisionProviders)
  36. {
  37. collisionsProvider.OnCollision += delegate
  38. {
  39. if (_wasCollided)
  40. return;
  41. Destroy(gameObject);
  42. _wasCollided = true;
  43. };
  44. }
  45. }
  46. private void FixedUpdate()
  47. {
  48. if (!IsRunning)
  49. return;
  50. if (!_shouldFocusOnTarget)
  51. return;
  52. Vector3 targetPosition;
  53. if (FollowTarget)
  54. targetPosition = TargetTransform != null
  55. ? TargetTransform.transform.position
  56. : transform.position + transform.forward;
  57. else
  58. targetPosition = TargetPosition;
  59. m_sfxDistanceCollisionDetector.TargetPosition = targetPosition;
  60. var direction = (targetPosition - transform.position).normalized;
  61. _rigidbody.velocity = transform.forward * Velocity;
  62. var targetRotation = Quaternion.LookRotation(direction);
  63. _rigidbody.MoveRotation(Quaternion.RotateTowards(transform.rotation, targetRotation, Turn));
  64. }
  65. private void OnDrawGizmos()
  66. {
  67. if (!IsDebug)
  68. return;
  69. Gizmos.DrawSphere(LaunchPosition, 0.2f);
  70. if (TargetTransform != null)
  71. Gizmos.DrawSphere(TargetTransform.transform.position, 0.2f);
  72. }
  73. }
  74. }