summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts/Physics/PhysicsManager.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-05-09 18:52:28 +0800
committerchai <215380520@qq.com>2023-05-09 18:52:28 +0800
commit4afa7c36ba9ec33ed113dcfb7cd33bd630d444f2 (patch)
treead7260d6a1e84cd1ab56493294301df34d6bb5a6 /marching/Assets/Scripts/Physics/PhysicsManager.cs
parentf986dc197b5e093575bc0b56ee0ded991c228639 (diff)
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsManager.cs')
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager.cs154
1 files changed, 97 insertions, 57 deletions
diff --git a/marching/Assets/Scripts/Physics/PhysicsManager.cs b/marching/Assets/Scripts/Physics/PhysicsManager.cs
index c4e6017..bfb1dfe 100644
--- a/marching/Assets/Scripts/Physics/PhysicsManager.cs
+++ b/marching/Assets/Scripts/Physics/PhysicsManager.cs
@@ -11,116 +11,151 @@ public enum ColliderType
Hitbox,
}
+class PhysicsQuadtree
+{
+ public Vector4 quadtreeRange { set { m_QuadtreeRange = value; } }
+ private Vector4 m_QuadtreeRange;
+ private Quadtree m_Quadtree;
+ private List<IQuadTreeObject> m_Objects = new List<IQuadTreeObject>();
+
+ public PhysicsQuadtree(Vector4 range)
+ {
+ m_QuadtreeRange = range;
+ m_Quadtree = new Quadtree(0, range);
+ }
+
+ public void AddObject(IQuadTreeObject obj)
+ {
+ m_Objects.Add(obj);
+ }
+
+ public void RemoveObject(IQuadTreeObject obj)
+ {
+ m_Objects.Remove(obj);
+ }
+
+ public void UpdateQuadtree()
+ {
+ m_Quadtree.Clear(false);
+ m_Quadtree.Rebound(m_QuadtreeRange);
+ for (int i = 0; i < m_Objects.Count; i++)
+ {
+ IQuadTreeObject obj = m_Objects[i];
+ m_Quadtree.Insert(obj);
+ }
+ }
+
+ public void Debug()
+ {
+ Color c = Gizmos.color;
+ Gizmos.color = Color.red;
+ m_Quadtree?.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 Retrive(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj)
+ {
+ return m_Quadtree.Retrieve(ref returnObjs, obj);
+ }
+
+ public bool Retrive(ref List<IQuadTreeObject> returnObjs, Vector4 bound)
+ {
+ return m_Quadtree.Retrieve(ref returnObjs, bound);
+ }
+
+}
+
/// <summary>
/// 四叉树空间划分,优化碰撞检测
/// </summary>
public partial class PhysicsManager : Singleton<PhysicsManager>
{
#region Quadtrees
- public Vector4 quadtreeCollisionRange { set { m_QuadtreeCollisionRange = value; } }
- private Vector4 m_QuadtreeCollisionRange;
- private Quadtree m_QuadtreeCollision;
- private List<IQuadTreeObject> m_QuadtreeObjColliders = 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>();
- #endregion
+ private PhysicsQuadtree m_CollisionQuadtree;
+ private PhysicsQuadtree m_HurtboxQuadtree;
+ #endregion
+
+ public Vector4 collisionQuadtreeRange
+ {
+ set
+ {
+ m_CollisionQuadtree.quadtreeRange = value;
+ }
+ }
+
+ public Vector4 hurtboxQuadtreeRange
+ {
+ set
+ {
+ m_HurtboxQuadtree.quadtreeRange = value;
+ }
+ }
+
public List<IQuadTreeObject> sharedRetriveResults => m_SharedRetriveResults;
private List<IQuadTreeObject> m_SharedRetriveResults = new List<IQuadTreeObject>();
public PhysicsManager()
{
- m_QuadtreeCollision = new Quadtree(0, new Vector4(0, 0, 30, 30));
- m_QuadtreeHurtboxes= new Quadtree(0, new Vector4(0,0, 30, 30));
+ m_CollisionQuadtree = new PhysicsQuadtree(new Vector4(0, 0, 30, 30));
+ m_HurtboxQuadtree = new PhysicsQuadtree(new Vector4(0, 0, 30, 30));
}
public void AddCollider(IQuadTreeObject collider)
{
- m_QuadtreeObjColliders.Add(collider);
+ m_CollisionQuadtree.AddObject(collider);
}
public void RemoveCollider(IQuadTreeObject collider)
{
- m_QuadtreeObjColliders.Remove(collider);
+ m_CollisionQuadtree.RemoveObject(collider);
}
public void AddHurtboxes(IQuadTreeObject hurtbox)
{
- m_QuadtreeObjHurtboxes.Add(hurtbox);
+ m_HurtboxQuadtree.AddObject(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);
- }
+ m_HurtboxQuadtree.RemoveObject(hurtbox);
}
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;
+ m_CollisionQuadtree.UpdateQuadtree();
+ m_HurtboxQuadtree.UpdateQuadtree();
}
public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj)
{
- return m_QuadtreeCollision.Retrieve(ref returnObjs, obj);
+ return m_CollisionQuadtree.Retrive(ref returnObjs, obj);
}
public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, Vector4 bound)
{
- return m_QuadtreeCollision.Retrieve(ref returnObjs, bound);
+ return m_CollisionQuadtree.Retrive(ref returnObjs, bound);
}
public bool RetriveHurtboxes(ref List<IQuadTreeObject> returnObjs, Vector4 bound)
{
- return m_QuadtreeHurtboxes.Retrieve(ref returnObjs, bound);
+ return m_HurtboxQuadtree.Retrive(ref returnObjs, bound);
}
public bool RetriveColliders(Vector4 bound)
{
m_SharedRetriveResults.Clear();
- return m_QuadtreeCollision.Retrieve(ref m_SharedRetriveResults, bound);
+ return m_CollisionQuadtree.Retrive(ref m_SharedRetriveResults, bound);
}
public bool RetriveHurtboxes(Vector4 bound)
{
m_SharedRetriveResults.Clear();
- return m_QuadtreeHurtboxes.Retrieve(ref m_SharedRetriveResults, bound);
+ return m_HurtboxQuadtree.Retrive(ref m_SharedRetriveResults, bound);
}
public System.Func<Vector4, bool> GetRetriverByType(ColliderType type)
@@ -133,4 +168,9 @@ public partial class PhysicsManager : Singleton<PhysicsManager>
return null;
}
+ public void Debug()
+ {
+ m_CollisionQuadtree.Debug();
+ }
+
} \ No newline at end of file