diff options
author | chai <215380520@qq.com> | 2023-05-09 18:52:28 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-05-09 18:52:28 +0800 |
commit | 4afa7c36ba9ec33ed113dcfb7cd33bd630d444f2 (patch) | |
tree | ad7260d6a1e84cd1ab56493294301df34d6bb5a6 /marching/Assets/Scripts/Physics/PhysicsManager.cs | |
parent | f986dc197b5e093575bc0b56ee0ded991c228639 (diff) |
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsManager.cs')
-rw-r--r-- | marching/Assets/Scripts/Physics/PhysicsManager.cs | 154 |
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 |