summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/AnimationData.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-09-02 16:50:41 +0800
committerchai <chaifix@163.com>2021-09-02 16:50:41 +0800
commit7a73788fec18aa8648a4ff7d1d86760b22908513 (patch)
tree1ee29f40478c036667d15b809ae46105cfbeeb16 /Assets/Scripts/Unit/AnimationData.cs
parentadb364a79f5dd69de08f72072cc2261131314e53 (diff)
*misc
Diffstat (limited to 'Assets/Scripts/Unit/AnimationData.cs')
-rw-r--r--Assets/Scripts/Unit/AnimationData.cs81
1 files changed, 75 insertions, 6 deletions
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<PosData> 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>();
+ }
+ 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<ColliderData> blockBoxes;
public List<ColliderData> 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