using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public struct ColliderInfo { public bool active; public Vector3 position; public Vector3 size; } [Serializable] public class ColliderData { [Serializable] public class ColliderFrame { public int frame; public bool active; public Vector3 position; public Vector3 size; } public ColliderBox.EColliderType type; public ColliderBox.Pivot pivot; public List frames; public ColliderData(ColliderBox.EColliderType type, ColliderBox.Pivot pivot) { this.type = type; this.pivot = pivot; this.frames = new List(); } public ColliderInfo GetColliderInfo(float frame) { ColliderInfo info = new ColliderInfo(); info.active = false; // default int previous = 0; int end = -1; for (int i = 0; i < frames.Count; ++i) { if(frame >= frames[i].frame) { previous = frames[i].frame; } if(frames[i].frame > frame) { end = frames[i].frame; break; } } if(end == -1) { if(type == ColliderBox.EColliderType.HurtBox) { ColliderFrame pre = frames.Find(s => s.frame == previous); if (pre == null) return info; info.active = pre.active; info.position = pre.position; info.size = pre.size; } } else { ColliderFrame pre = frames.Find(s => s.frame == previous); ColliderFrame next = frames.Find(s => s.frame == end); if (pre == null || next == null) return info; info.active = pre.active; float t = (frame - previous) / (end - previous); info.position = Vector3.Lerp(pre.position, next.position, t); info.size = Vector3.Lerp(pre.size, next.size, t); } return info; } public void AddFrame(int frameIndex) { if (frames == null) frames = new List(); ColliderFrame frame = new ColliderFrame(); frame.frame = frameIndex; frame.active = true; frame.position = Vector3.zero; frame.size = Vector3.one; frames.Add(frame); frames.Sort((a, b) => { if (a == null) return 1; if (b == null) return -1; if (a.frame < b.frame) return -1; if (a.frame > b.frame) return 1; return 0; }); } public void DeleteFrame(int frameIndex) { if (frames == null) return; ColliderFrame frame = null; foreach(var f in frames) { if (f.frame == frameIndex) frame = f; } if(frame != null) { frames.Remove(frame); } } }