SFX_PhysicsMotion.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using UnityEngine;
  2. // ReSharper disable once CheckNamespace
  3. namespace QFX.SFX
  4. {
  5. [RequireComponent(typeof(SFX_ICollisionsProvider))]
  6. public class SFX_PhysicsMotion : SFX_ControlledObject
  7. {
  8. public float ColliderRadius = 0.1f;
  9. public float Speed;
  10. public float Mass;
  11. public float Drag;
  12. public bool UseGravity;
  13. public ForceMode ForceMode;
  14. public Transform Target;
  15. public bool DestroyAfterCollision;
  16. public float DestroyAfterCollisionTimeout;
  17. private SphereCollider _sphereCollider;
  18. private Rigidbody _rigidbody;
  19. public override void Run()
  20. {
  21. base.Run();
  22. var targetDirection =
  23. Target != null ? (Target.position - transform.position).normalized : transform.forward;
  24. _rigidbody.AddForce(targetDirection * Speed, ForceMode);
  25. }
  26. private void Awake()
  27. {
  28. _rigidbody = gameObject.GetComponent<Rigidbody>();
  29. _rigidbody.mass = Mass;
  30. _rigidbody.drag = Drag;
  31. _rigidbody.useGravity = UseGravity;
  32. _rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
  33. _rigidbody.interpolation = RigidbodyInterpolation.Interpolate;
  34. _sphereCollider = gameObject.AddComponent<SphereCollider>();
  35. _sphereCollider.radius = ColliderRadius;
  36. var collisionsProvider = GetComponent<SFX_ICollisionsProvider>();
  37. collisionsProvider.OnCollision += delegate
  38. {
  39. if (DestroyAfterCollision)
  40. Destroy(gameObject, DestroyAfterCollisionTimeout);
  41. };
  42. }
  43. }
  44. }