DynamicBoneStatus.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using kt.Serialization;
  3. using UnityEngine;
  4. [Serializable]
  5. public class DynamicBoneStatus : ASerializationVersionControl
  6. {
  7. public override int FixVersion
  8. {
  9. get
  10. {
  11. return 1000;
  12. }
  13. }
  14. public override void OnBeforeSerialize()
  15. {
  16. base.OnBeforeSerialize();
  17. this.DampingKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.dampingCurve);
  18. this.ElasticityKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.elasticityCurve);
  19. this.StiffnessKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.stiffnessCurve);
  20. this.InertKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.inertCurve);
  21. this.RadiusKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.radiusCurve);
  22. }
  23. public override void OnAfterDeserialize()
  24. {
  25. base.OnAfterDeserialize();
  26. this.dampingCurve = DynamicBoneStatus.CreateAnimationCurve(this.DampingKeyFrames);
  27. this.elasticityCurve = DynamicBoneStatus.CreateAnimationCurve(this.ElasticityKeyFrames);
  28. this.stiffnessCurve = DynamicBoneStatus.CreateAnimationCurve(this.StiffnessKeyFrames);
  29. this.inertCurve = DynamicBoneStatus.CreateAnimationCurve(this.InertKeyFrames);
  30. this.radiusCurve = DynamicBoneStatus.CreateAnimationCurve(this.RadiusKeyFrames);
  31. }
  32. public static DynamicBoneStatus.AnimationKeyFrame[] CreateAnimationKeyFrames(AnimationCurve curve)
  33. {
  34. Keyframe[] array = (curve == null) ? null : curve.keys;
  35. if (array == null)
  36. {
  37. return new DynamicBoneStatus.AnimationKeyFrame[0];
  38. }
  39. DynamicBoneStatus.AnimationKeyFrame[] array2 = new DynamicBoneStatus.AnimationKeyFrame[array.Length];
  40. for (int i = 0; i < array.Length; i++)
  41. {
  42. array2[i] = new DynamicBoneStatus.AnimationKeyFrame
  43. {
  44. time = array[i].time,
  45. value = array[i].value,
  46. inTangent = array[i].inTangent,
  47. outTangent = array[i].outTangent
  48. };
  49. }
  50. return array2;
  51. }
  52. public static AnimationCurve CreateAnimationCurve(DynamicBoneStatus.AnimationKeyFrame[] keys)
  53. {
  54. if (keys == null)
  55. {
  56. return null;
  57. }
  58. Keyframe[] array = new Keyframe[keys.Length];
  59. for (int i = 0; i < array.Length; i++)
  60. {
  61. array[i] = new Keyframe
  62. {
  63. time = keys[i].time,
  64. value = keys[i].value,
  65. inTangent = keys[i].inTangent,
  66. outTangent = keys[i].outTangent
  67. };
  68. }
  69. return new AnimationCurve(array);
  70. }
  71. [Header("減衰率。値が小さいと素早く小刻みに揺れる。大きいとゆっくり大振りで揺れる。")]
  72. [Range(0f, 1f)]
  73. public float damping = 0.6f;
  74. [SerializeField]
  75. [HideInInspector]
  76. private DynamicBoneStatus.AnimationKeyFrame[] DampingKeyFrames;
  77. public AnimationCurve dampingCurve;
  78. [Header("復元率。値が大きいと素早く元の形状に戻る。小さいとゆっくりと元の形状に戻る。")]
  79. [Range(0f, 1f)]
  80. public float elasticity = 0.1f;
  81. [SerializeField]
  82. [HideInInspector]
  83. private DynamicBoneStatus.AnimationKeyFrame[] ElasticityKeyFrames;
  84. public AnimationCurve elasticityCurve;
  85. [Header("剛性(揺れ幅)")]
  86. [Range(0f, 1f)]
  87. public float stiffness = 0.1f;
  88. [SerializeField]
  89. [HideInInspector]
  90. private DynamicBoneStatus.AnimationKeyFrame[] StiffnessKeyFrames;
  91. public AnimationCurve stiffnessCurve;
  92. [Header("移動距離による物理無視率。値が大きいほど少しの移動では揺れなくなる。")]
  93. [Range(0f, 1f)]
  94. public float inert;
  95. [SerializeField]
  96. [HideInInspector]
  97. private DynamicBoneStatus.AnimationKeyFrame[] InertKeyFrames;
  98. public AnimationCurve inertCurve;
  99. [Header("各ノードの当たり判定半径")]
  100. public float radius;
  101. [SerializeField]
  102. [HideInInspector]
  103. private DynamicBoneStatus.AnimationKeyFrame[] RadiusKeyFrames;
  104. public AnimationCurve radiusCurve;
  105. [Header("先端に余分ボーンの追加")]
  106. public float endLength;
  107. [Header("先端に余分ボーンのオフセット座標")]
  108. public Vector3 endOffset;
  109. [Header("重力の向き(形はある程度維持される)")]
  110. public Vector3 gravity = Vector3.down * 0.05f;
  111. [Header("力の向き(形は維持されない)")]
  112. public Vector3 force;
  113. [Header("揺れを「行わない」向きの指定。指定した場合はその向きには揺れなくなる")]
  114. public DynamicBoneStatus.FreezeAxis freezeAxis;
  115. public enum FreezeAxis
  116. {
  117. None,
  118. X,
  119. Y,
  120. Z
  121. }
  122. [Serializable]
  123. public class AnimationKeyFrame
  124. {
  125. public float time;
  126. public float value;
  127. public float inTangent;
  128. public float outTangent;
  129. }
  130. }