From 7a73788fec18aa8648a4ff7d1d86760b22908513 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 2 Sep 2021 16:50:41 +0800 Subject: *misc --- Assets/Scripts/Unit/AnimationData.cs | 81 +++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 6 deletions(-) (limited to 'Assets/Scripts/Unit/AnimationData.cs') diff --git a/Assets/Scripts/Unit/AnimationData.cs b/Assets/Scripts/Unit/AnimationData.cs index 80891d83..30762b39 100644 --- a/Assets/Scripts/Unit/AnimationData.cs +++ b/Assets/Scripts/Unit/AnimationData.cs @@ -82,8 +82,13 @@ public class RootMotionOverrideData [Serializable] public class PosData { - [SerializeField] Vector3 position; - [SerializeField] float frame; + [SerializeField] public Vector3 position; + [SerializeField] public int frame; + public PosData(int frame, Vector3 pos) + { + this.frame = frame; + this.position = pos; + } } [SerializeField] public List positions; public RootMotionOverrideData() @@ -92,7 +97,68 @@ public class RootMotionOverrideData } public Vector3 GetPosition(float frame) { - return Vector3.zero; + if (positions == null || positions.Count == 0) + return Vector3.zero; + positions.Sort((p1, p2) => { + if (p1.frame < p2.frame) + return -1; + if (p1.frame > p2.frame) + return 1; + return 0; + }); + int prev = 0; + int next = 0; + for(int i = 0;i < positions.Count; ++i) + { + if(positions[i].frame > frame) + { + break; + } + prev = i; + next = Mathf.Clamp(i + 1, 0, positions.Count - 1); + } + float t = 0; + if(prev != next) + { + t = (frame - positions[prev].frame) / (positions[next].frame - positions[prev].frame); + } + Vector3 pos = Vector3.Lerp(positions[prev].position, positions[next].position, t); + return pos; + } + + public Vector3 GetRootMotionDistance(float prevFrame, float curFrame) + { + Vector3 p1 = GetPosition(prevFrame); + Vector3 p2 = GetPosition(curFrame); + return p2 - p1; + } + + public void SetPosition(int frame, Vector3 position) + { + if(positions == null) + { + positions = new List(); + } + PosData pd = positions.Find(s => s.frame == frame); + if(pd != null) + { + pd.position = position; + } + else + { + positions.Add(new PosData(frame, position)); + } + } + + public void RemovePositionAtFrame(float frame) + { + if (positions == null) + return; + PosData pd = positions.Find(s => s.frame == frame); + if(pd != null) + { + positions.Remove(pd); + } } } @@ -111,7 +177,8 @@ public class AnimationData : ScriptableObject public List blockBoxes; public List defendBoxes; - public RootMotionOverrideData overrideRootMotion; + public bool overrideRootMotion; + public RootMotionOverrideData rootMotionOverrideData; // 对应的进度的播放速度,默认是1 [UnityEngine.Serialization.FormerlySerializedAs("curve")] @@ -393,12 +460,14 @@ public class AnimationData : ScriptableObject public void AddRootMotionOverriderData( ) { - this.overrideRootMotion = new RootMotionOverrideData(); + this.overrideRootMotion = true; + this.rootMotionOverrideData = new RootMotionOverrideData(); } public void DeleteRootMotionOverrideData() { - this.overrideRootMotion = null; + this.overrideRootMotion = false; + this.rootMotionOverrideData = null; } #if UNITY_EDITOR -- cgit v1.1-26-g67d0