From c35533e31efe30121a7c61a725fdaaba47714296 Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Tue, 9 May 2023 10:17:45 +0800 Subject: *misc --- marching/Assets/Scripts/Physics/PhysicsManager.cs | 101 +++++++++++++++++++--- 1 file changed, 87 insertions(+), 14 deletions(-) (limited to 'marching/Assets/Scripts/Physics/PhysicsManager.cs') 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 quadTreeObjects = new List(); +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(); - private static List m_SharedCastResult = new List(); + public Vector4 quadtreeHurtboxRange { set { m_QuadtreeHurtboxRange = value; } } + private Vector4 m_QuadtreeHurtboxRange; + private Quadtree m_QuadtreeHurtboxes; + private List m_QuadtreeObjHurtboxes = new List(); - 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); } - /// - /// box, pos+size - /// - /// - /// - public static List 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 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; } } \ No newline at end of file -- cgit v1.1-26-g67d0