Bouyancy.cs 983 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. 
  2. using UnityEngine;
  3. public class Bouyancy : MonoBehaviour
  4. {
  5. public float waterLevel = 0.0f;
  6. public float floatHeight = 0.0f;
  7. public Vector3 buoyancyCentreOffset = Vector3.zero;
  8. public float bounceDamp = 1.0f;
  9. public GameObject water;
  10. public MegaDynamicRipple dynamicwater;
  11. Rigidbody rbody;
  12. void Start()
  13. {
  14. rbody = GetComponent<Rigidbody>();
  15. if ( water )
  16. {
  17. dynamicwater = (MegaDynamicRipple)water.GetComponent<MegaDynamicRipple>();
  18. }
  19. }
  20. void FixedUpdate()
  21. {
  22. if ( dynamicwater )
  23. {
  24. waterLevel = dynamicwater.GetWaterHeight(water.transform.worldToLocalMatrix.MultiplyPoint(transform.position));
  25. }
  26. Vector3 actionPoint = transform.position + transform.TransformDirection(buoyancyCentreOffset);
  27. float forceFactor = 1.0f - ((actionPoint.y - waterLevel) / floatHeight);
  28. if ( forceFactor > 0.0f )
  29. {
  30. Vector3 uplift = -Physics.gravity * (forceFactor - rbody.velocity.y * bounceDamp);
  31. rbody.AddForceAtPosition(uplift, actionPoint);
  32. }
  33. }
  34. }