SoftConnection.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace SoftKitty
  5. {
  6. [System.Serializable]
  7. public class SoftConnectionData
  8. {
  9. public bool Active = false;
  10. public bool SoftFollow = true;
  11. [Range(1F,60F)]
  12. public float FollowSpeed = 10F;
  13. public bool Spring = true;
  14. [Range(0F, 1F)]
  15. public float SpringDampping = 0.5F;
  16. [HideInInspector]
  17. public Vector3 Velocity=new Vector3(0F,0F,0F);
  18. [HideInInspector]
  19. public Quaternion AngularVelocity = Quaternion.identity;
  20. }
  21. [DefaultExecutionOrder(50)]
  22. public class SoftConnection : MonoBehaviour
  23. {
  24. public Transform Target;
  25. public SoftConnectionData PositionConnection;
  26. public SoftConnectionData RotationConnection;
  27. public SoftConnectionData ScaleConnection;
  28. Vector3 pos;
  29. Quaternion rot;
  30. void Start()
  31. {
  32. pos = Target.position;
  33. rot = Target.rotation;
  34. }
  35. void LateUpdate()
  36. {
  37. if (PositionConnection.Active)
  38. {
  39. if (PositionConnection.SoftFollow)
  40. {
  41. pos = Vector3.Lerp(pos, Target.position+ PositionConnection.Velocity, PositionConnection.FollowSpeed *Time.deltaTime);
  42. if (PositionConnection.Spring) {
  43. PositionConnection.Velocity += Vector3.Lerp((Target.position - pos) * PositionConnection.FollowSpeed * Time.deltaTime,Vector3.zero, PositionConnection.SpringDampping*0.8F);
  44. PositionConnection.Velocity = Vector3.Lerp(PositionConnection.Velocity,Vector3.zero,Time.deltaTime* PositionConnection.SpringDampping *2F);
  45. }
  46. transform.position = pos;
  47. }
  48. else
  49. {
  50. transform.position = Target.position;
  51. }
  52. }
  53. if (RotationConnection.Active)
  54. {
  55. if (RotationConnection.SoftFollow)
  56. {
  57. rot = Quaternion.Lerp(rot, Target.rotation * RotationConnection.AngularVelocity, RotationConnection.FollowSpeed *1.5F* Time.deltaTime);
  58. if (RotationConnection.Spring)
  59. {
  60. RotationConnection.AngularVelocity *= Quaternion.Lerp(Quaternion.Inverse(rot) *Target.rotation, Quaternion.identity,0.5F+RotationConnection.SpringDampping*0.45F);
  61. RotationConnection.AngularVelocity =Quaternion.Lerp(RotationConnection.AngularVelocity,Quaternion.identity, Time.deltaTime * RotationConnection.SpringDampping * 2F);
  62. }
  63. transform.rotation = rot;
  64. }
  65. else
  66. {
  67. transform.rotation = Target.rotation;
  68. }
  69. }
  70. if (ScaleConnection.Active)
  71. {
  72. if (ScaleConnection.SoftFollow)
  73. {
  74. transform.localScale = Vector3.Lerp(transform.localScale, Target.localScale + ScaleConnection.Velocity, ScaleConnection.FollowSpeed * Time.deltaTime);
  75. if (ScaleConnection.Spring)
  76. {
  77. ScaleConnection.Velocity += Vector3.Lerp((Target.localScale - transform.localScale) * ScaleConnection.FollowSpeed * Time.deltaTime, Vector3.zero, ScaleConnection.SpringDampping * 0.8F);
  78. ScaleConnection.Velocity = Vector3.Lerp(ScaleConnection.Velocity, Vector3.zero, Time.deltaTime * ScaleConnection.SpringDampping * 2F);
  79. }
  80. }
  81. else
  82. {
  83. transform.localScale = Target.localScale;
  84. }
  85. }
  86. }
  87. }
  88. }