using mh; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; public enum ColliderType { Collider, Hurtbox, Hitbox, } public class PhysicsManager : Singleton { public Vector4 quadtreeCollisionRange { set { m_QuadtreeCollisionRange = value; } } private Vector4 m_QuadtreeCollisionRange; private Quadtree m_QuadtreeCollision; private List m_QuadtreeObjColliders = new List(); public Vector4 quadtreeHurtboxRange { set { m_QuadtreeHurtboxRange = value; } } private Vector4 m_QuadtreeHurtboxRange; private Quadtree m_QuadtreeHurtboxes; private List m_QuadtreeObjHurtboxes = new List(); 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) { m_QuadtreeObjHurtboxes.Remove(hurtbox); } public void UpdateQuadtreeCollision() { 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); } } 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); } } 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 returnObjs, IQuadTreeObject obj) { return m_QuadtreeCollision.Retrieve(ref returnObjs, obj); } public bool RetriveColliders(ref List 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; } }