From 5f9bce715954b5b6e2db1168f0a065cce23f5519 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 5 Aug 2021 17:32:37 +0800 Subject: *misc --- Assets/Scripts/Unit/AnimationData.cs | 85 +++++++++++++++++++++++++++ Assets/Scripts/Unit/Collider/ColliderData.cs | 11 ++++ Assets/Scripts/Unit/Component/UnitCollider.cs | 12 +--- Assets/Scripts/Unit/UnitTimeline.cs | 1 + 4 files changed, 98 insertions(+), 11 deletions(-) (limited to 'Assets/Scripts/Unit') 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 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; -- cgit v1.1-26-g67d0