summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts/Physics/PhysicsManager.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-05-09 10:17:45 +0800
committerchai <215380520@qq.com>2023-05-09 10:17:45 +0800
commitc35533e31efe30121a7c61a725fdaaba47714296 (patch)
treeb25bc22f00911f376c741b89b0591d2d48565e79 /marching/Assets/Scripts/Physics/PhysicsManager.cs
parentd2a574ba76c56c340d8ac0ad841344664bc2cc59 (diff)
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsManager.cs')
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager.cs101
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