diff options
author | chai <215380520@qq.com> | 2023-05-09 10:17:45 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-05-09 10:17:45 +0800 |
commit | c35533e31efe30121a7c61a725fdaaba47714296 (patch) | |
tree | b25bc22f00911f376c741b89b0591d2d48565e79 /marching/Assets/Scripts/Physics/PhysicsManager.cs | |
parent | d2a574ba76c56c340d8ac0ad841344664bc2cc59 (diff) |
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsManager.cs')
-rw-r--r-- | marching/Assets/Scripts/Physics/PhysicsManager.cs | 101 |
1 files changed, 87 insertions, 14 deletions
diff --git a/marching/Assets/Scripts/Physics/PhysicsManager.cs b/marching/Assets/Scripts/Physics/PhysicsManager.cs index 0577aa9..6daf610 100644 --- a/marching/Assets/Scripts/Physics/PhysicsManager.cs +++ b/marching/Assets/Scripts/Physics/PhysicsManager.cs @@ -4,31 +4,104 @@ using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; -public static class PhysicsManager +public enum ColliderType { + Collider, + Hurtbox, + Hitbox, +} - public static List<IQuadTreeObject> quadTreeObjects = new List<IQuadTreeObject>(); +public class PhysicsManager : Singleton<PhysicsManager> +{ + public Vector4 quadtreeCollisionRange { set { m_QuadtreeCollisionRange = value; } } + private Vector4 m_QuadtreeCollisionRange; + private Quadtree m_QuadtreeCollision; + private List<IQuadTreeObject> m_QuadtreeObjColliders = new List<IQuadTreeObject>(); - private static List<IQuadTreeObject> m_SharedCastResult = new List<IQuadTreeObject>(); + public Vector4 quadtreeHurtboxRange { set { m_QuadtreeHurtboxRange = value; } } + private Vector4 m_QuadtreeHurtboxRange; + private Quadtree m_QuadtreeHurtboxes; + private List<IQuadTreeObject> m_QuadtreeObjHurtboxes = new List<IQuadTreeObject>(); - public static bool CircleVsCircle(Vector2 pos1, float r1, Vector2 pos2, float r2) + public PhysicsManager() + { + m_QuadtreeCollision = new Quadtree(0, new Vector4(0, 0, 30, 30)); + m_QuadtreeHurtboxes= new Quadtree(0, new Vector4(0,0, 30, 30)); + } + + public void AddCollider(IQuadTreeObject collider) + { + m_QuadtreeObjColliders.Add(collider); + } + + public void RemoveCollider(IQuadTreeObject collider) + { + m_QuadtreeObjColliders.Remove(collider); + } + + public void AddHurtboxes(IQuadTreeObject hurtbox) + { + m_QuadtreeObjHurtboxes.Add(hurtbox); + } + + public void RemoveHurtbox(IQuadTreeObject hurtbox) { - return (pos1 - pos2).magnitude < r1+r2; + m_QuadtreeObjHurtboxes.Remove(hurtbox); } - /// <summary> - /// box, pos+size - /// </summary> - /// <param name="box"></param> - /// <returns></returns> - public static List<IQuadTreeObject> BoxCast(Vector4 box) + public void UpdateQuadtreeCollision() { - m_SharedCastResult.Clear(); + m_QuadtreeCollision.Clear(false); + m_QuadtreeCollision.Rebound(m_QuadtreeCollisionRange); + for (int i = 0; i < m_QuadtreeObjColliders.Count; i++) + { + IQuadTreeObject obj = m_QuadtreeObjColliders[i]; + m_QuadtreeCollision.Insert(obj); + } + } - if (TestQuadtree.quadtree.Retrieve(ref m_SharedCastResult, box)) + public void UpdateQuadtreeHurtbox() + { + m_QuadtreeHurtboxes.Clear(false); + m_QuadtreeHurtboxes.Rebound(m_QuadtreeHurtboxRange); + for (int i = 0; i < m_QuadtreeObjHurtboxes.Count; i++) { + IQuadTreeObject obj = m_QuadtreeObjHurtboxes[i]; + m_QuadtreeHurtboxes.Insert(obj); } - return m_SharedCastResult; + } + + public void Update() + { + UpdateQuadtreeCollision(); + UpdateQuadtreeHurtbox(); + } + + public void Debug() + { + Color c = Gizmos.color; + Gizmos.color = Color.red; + m_QuadtreeCollision?.Iterate((t) => { + Vector3 pos = new Vector3(t.x, t.y, 0); + Vector3 size = new Vector3(t.w, t.h, 1); + Gizmos.DrawWireCube(pos, size); + }); + Gizmos.color = c; + } + + public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj) + { + return m_QuadtreeCollision.Retrieve(ref returnObjs, obj); + } + + public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, Vector4 bound) + { + return m_QuadtreeCollision.Retrieve(ref returnObjs, bound); + } + + public static bool CircleVsCircle(Vector2 pos1, float r1, Vector2 pos2, float r2) + { + return (pos1 - pos2).magnitude <= r1+r2; } }
\ No newline at end of file |