using System; using kt.Serialization; using UnityEngine; [Serializable] public class DynamicBoneStatus : ASerializationVersionControl { public override int FixVersion { get { return 1000; } } public override void OnBeforeSerialize() { base.OnBeforeSerialize(); this.DampingKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.dampingCurve); this.ElasticityKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.elasticityCurve); this.StiffnessKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.stiffnessCurve); this.InertKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.inertCurve); this.RadiusKeyFrames = DynamicBoneStatus.CreateAnimationKeyFrames(this.radiusCurve); } public override void OnAfterDeserialize() { base.OnAfterDeserialize(); this.dampingCurve = DynamicBoneStatus.CreateAnimationCurve(this.DampingKeyFrames); this.elasticityCurve = DynamicBoneStatus.CreateAnimationCurve(this.ElasticityKeyFrames); this.stiffnessCurve = DynamicBoneStatus.CreateAnimationCurve(this.StiffnessKeyFrames); this.inertCurve = DynamicBoneStatus.CreateAnimationCurve(this.InertKeyFrames); this.radiusCurve = DynamicBoneStatus.CreateAnimationCurve(this.RadiusKeyFrames); } public static DynamicBoneStatus.AnimationKeyFrame[] CreateAnimationKeyFrames(AnimationCurve curve) { Keyframe[] array = (curve == null) ? null : curve.keys; if (array == null) { return new DynamicBoneStatus.AnimationKeyFrame[0]; } DynamicBoneStatus.AnimationKeyFrame[] array2 = new DynamicBoneStatus.AnimationKeyFrame[array.Length]; for (int i = 0; i < array.Length; i++) { array2[i] = new DynamicBoneStatus.AnimationKeyFrame { time = array[i].time, value = array[i].value, inTangent = array[i].inTangent, outTangent = array[i].outTangent }; } return array2; } public static AnimationCurve CreateAnimationCurve(DynamicBoneStatus.AnimationKeyFrame[] keys) { if (keys == null) { return null; } Keyframe[] array = new Keyframe[keys.Length]; for (int i = 0; i < array.Length; i++) { array[i] = new Keyframe { time = keys[i].time, value = keys[i].value, inTangent = keys[i].inTangent, outTangent = keys[i].outTangent }; } return new AnimationCurve(array); } [Header("減衰率。値が小さいと素早く小刻みに揺れる。大きいとゆっくり大振りで揺れる。")] [Range(0f, 1f)] public float damping = 0.6f; [SerializeField] [HideInInspector] private DynamicBoneStatus.AnimationKeyFrame[] DampingKeyFrames; public AnimationCurve dampingCurve; [Header("復元率。値が大きいと素早く元の形状に戻る。小さいとゆっくりと元の形状に戻る。")] [Range(0f, 1f)] public float elasticity = 0.1f; [SerializeField] [HideInInspector] private DynamicBoneStatus.AnimationKeyFrame[] ElasticityKeyFrames; public AnimationCurve elasticityCurve; [Header("剛性(揺れ幅)")] [Range(0f, 1f)] public float stiffness = 0.1f; [SerializeField] [HideInInspector] private DynamicBoneStatus.AnimationKeyFrame[] StiffnessKeyFrames; public AnimationCurve stiffnessCurve; [Header("移動距離による物理無視率。値が大きいほど少しの移動では揺れなくなる。")] [Range(0f, 1f)] public float inert; [SerializeField] [HideInInspector] private DynamicBoneStatus.AnimationKeyFrame[] InertKeyFrames; public AnimationCurve inertCurve; [Header("各ノードの当たり判定半径")] public float radius; [SerializeField] [HideInInspector] private DynamicBoneStatus.AnimationKeyFrame[] RadiusKeyFrames; public AnimationCurve radiusCurve; [Header("先端に余分ボーンの追加")] public float endLength; [Header("先端に余分ボーンのオフセット座標")] public Vector3 endOffset; [Header("重力の向き(形はある程度維持される)")] public Vector3 gravity = Vector3.down * 0.05f; [Header("力の向き(形は維持されない)")] public Vector3 force; [Header("揺れを「行わない」向きの指定。指定した場合はその向きには揺れなくなる")] public DynamicBoneStatus.FreezeAxis freezeAxis; public enum FreezeAxis { None, X, Y, Z } [Serializable] public class AnimationKeyFrame { public float time; public float value; public float inTangent; public float outTangent; } }