summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r--Assets/Scripts/Unit/AnimationData.cs85
-rw-r--r--Assets/Scripts/Unit/Collider/ColliderData.cs11
-rw-r--r--Assets/Scripts/Unit/Component/UnitCollider.cs12
-rw-r--r--Assets/Scripts/Unit/UnitTimeline.cs1
4 files changed, 98 insertions, 11 deletions
diff --git a/Assets/Scripts/Unit/AnimationData.cs b/Assets/Scripts/Unit/AnimationData.cs
index 74f5eee1..211e9acb 100644
--- a/Assets/Scripts/Unit/AnimationData.cs
+++ b/Assets/Scripts/Unit/AnimationData.cs
@@ -24,6 +24,8 @@ public class AnimationData : ScriptableObject
// 对应的进度的播放速度,默认是1
public AnimationCurve curve;
+ public const int FPS = 30;
+
public AnimationData()
{
Keyframe frame0 = new Keyframe(0, 1);
@@ -31,6 +33,87 @@ public class AnimationData : ScriptableObject
curve = new AnimationCurve(frame0, frame1);
}
+ public List<ColliderData> GetColliderBoxesByType(ColliderBox.EColliderType type)
+ {
+ switch(type)
+ {
+ case ColliderBox.EColliderType.HurtBox:
+ return hurtBoxes;
+ case ColliderBox.EColliderType.HitBox:
+ return hitBoxes;
+ case ColliderBox.EColliderType.BlockBox:
+ return blockBoxes;
+ case ColliderBox.EColliderType.ThrowBox:
+ return throwBoxes;
+ case ColliderBox.EColliderType.DefendBox:
+ return defendBoxes;
+ }
+ return null;
+ }
+
+ public ColliderInfo GetColliderInfo(ColliderBox.EColliderType type, int index, float playbackTime)
+ {
+ return GetColliderInfoByFrame(type, index, playbackTime * FPS);
+ }
+
+ public ColliderInfo GetColliderInfoByFrame(ColliderBox.EColliderType type, int index, float frame)
+ {
+ ColliderInfo info = new ColliderInfo();
+ var colliders = GetColliderBoxesByType(type);
+ if (colliders == null || colliders.Count <= index)
+ return info; //info.isValid == false
+ info = colliders[index].GetColliderInfo(frame);
+ return info;
+ }
+
+ public ColliderInfo[] GetCollidersInfo(ColliderBox.EColliderType type, float playbackTime)
+ {
+ return GetCollidersInfoByFrame(type, playbackTime * FPS);
+ }
+
+ public ColliderInfo[] GetCollidersInfoByFrame(ColliderBox.EColliderType type, float frame)
+ {
+ var colliders = GetColliderBoxesByType(type);
+ if (colliders == null || colliders.Count == 0)
+ return null;
+ ColliderInfo[] infos = new ColliderInfo[colliders.Count];
+ for(int i = 0; i < colliders.Count; ++i)
+ {
+ infos[i] = colliders[i].GetColliderInfo(frame);
+ }
+ return infos;
+ }
+
+ public ColliderInfo[] GetActiveCollidersInfo(ColliderBox.EColliderType type, float playbackTime)
+ {
+ return GetActiveCollidersInfoByFrame(type , playbackTime * FPS);
+ }
+
+ public ColliderInfo[] GetActiveCollidersInfoByFrame(ColliderBox.EColliderType type, float frame)
+ {
+ var all = GetCollidersInfoByFrame(type, frame);
+ if (all == null || all.Length == 0)
+ return null;
+ int activeCount = 0;
+ foreach(var c in all)
+ {
+ if (c.active)
+ activeCount++;
+ }
+ if (activeCount == 0)
+ return null;
+ ColliderInfo[] active = new ColliderInfo[activeCount];
+ int i = 0;
+ foreach(var c in all)
+ {
+ if(c.active)
+ {
+ active[i++] = c;
+ }
+ }
+ return active;
+ }
+
public int GetBoxesCount()
{
int hurt = hurtBoxes != null ? hurtBoxes.Count : 0;
@@ -134,6 +217,8 @@ public class AnimationData : ScriptableObject
}
}
+
+
#if UNITY_EDITOR
public void OnSaveToDisk()
{
diff --git a/Assets/Scripts/Unit/Collider/ColliderData.cs b/Assets/Scripts/Unit/Collider/ColliderData.cs
index ad3b7326..4c8e5bed 100644
--- a/Assets/Scripts/Unit/Collider/ColliderData.cs
+++ b/Assets/Scripts/Unit/Collider/ColliderData.cs
@@ -3,13 +3,22 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+// 用来返回某一时刻的碰撞盒几何数据
public struct ColliderInfo
{
public bool active;
+ public float frame;
public Vector3 position;
public Vector3 size;
+ public ColliderBox.EColliderType type { get { return collider.type; } }
+ public ColliderBox.Pivot pivot { get { return collider.pivot; } }
+ public ColliderBox collider;
+ public int colliderHash { get { return collider.GetHashCode(); } }
+
+ public bool isValid { get { return collider != null; } } // 没有对应的数据时为false
}
+// 某个碰撞盒的属性和帧数据,从属于animation data
[Serializable]
public class ColliderData
{
@@ -42,6 +51,8 @@ public class ColliderData
{
ColliderInfo info = new ColliderInfo();
info.active = false; // default
+ info.collider = collider;
+ info.frame = frame;
int previous = 0;
int end = -1;
for (int i = 0; i < frames.Count; ++i)
diff --git a/Assets/Scripts/Unit/Component/UnitCollider.cs b/Assets/Scripts/Unit/Component/UnitCollider.cs
index 46b79f26..78757706 100644
--- a/Assets/Scripts/Unit/Component/UnitCollider.cs
+++ b/Assets/Scripts/Unit/Component/UnitCollider.cs
@@ -3,17 +3,7 @@ using System.Collections.Generic;
using UnityEngine;
[DisallowMultipleComponent]
-public class UnitCollider : MonoBehaviour
+public class UnitCollider : UnitComponent
{
- // Start is called before the first frame update
- void Start()
- {
-
- }
- // Update is called once per frame
- void Update()
- {
-
- }
}
diff --git a/Assets/Scripts/Unit/UnitTimeline.cs b/Assets/Scripts/Unit/UnitTimeline.cs
index ba8e652a..478840a9 100644
--- a/Assets/Scripts/Unit/UnitTimeline.cs
+++ b/Assets/Scripts/Unit/UnitTimeline.cs
@@ -36,6 +36,7 @@ public partial class UnitTimeline : MonoBehaviour
}
public const int kMaxEventsPerFrame = 10;
+ public const int FPS = 30; // timeline 每秒采样30次
private int m_PrevFrame = -1;