diff options
Diffstat (limited to 'marching/Assets/Scripts/Physics')
10 files changed, 145 insertions, 88 deletions
diff --git a/marching/Assets/Scripts/Physics/PhysicsManager.cs b/marching/Assets/Scripts/Physics/PhysicsManager.cs index bbba030..164d62b 100644 --- a/marching/Assets/Scripts/Physics/PhysicsManager.cs +++ b/marching/Assets/Scripts/Physics/PhysicsManager.cs @@ -13,87 +13,14 @@ public enum ColliderType public partial class PhysicsManager : Singleton<PhysicsManager> { - #region Quadtrees - 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() + public PhysicsManager() { 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_CollisionQuadtree.AddObject(collider); - } - - public void RemoveCollider(IQuadTreeObject collider) - { - m_CollisionQuadtree.RemoveObject(collider); - } - - public void AddHurtboxes(IQuadTreeObject hurtbox) - { - m_HurtboxQuadtree.AddObject(hurtbox); - } - - public void RemoveHurtbox(IQuadTreeObject hurtbox) - { - m_HurtboxQuadtree.RemoveObject(hurtbox); - } - - public void Update() - { - m_CollisionQuadtree.UpdateQuadtree(); - m_HurtboxQuadtree.UpdateQuadtree(); - } - - public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj) - { - return m_CollisionQuadtree.Retrive(ref returnObjs, obj); - } - - public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, Vector4 bound) - { - return m_CollisionQuadtree.Retrive(ref returnObjs, bound); - } - - public bool RetriveHurtboxes(ref List<IQuadTreeObject> returnObjs, Vector4 bound) - { - return m_HurtboxQuadtree.Retrive(ref returnObjs, bound); - } - - public bool RetriveColliders(Vector4 bound) - { - m_SharedRetriveResults.Clear(); - return m_CollisionQuadtree.Retrive(ref m_SharedRetriveResults, bound); - } - - public bool RetriveHurtboxes(Vector4 bound) - { - m_SharedRetriveResults.Clear(); - return m_HurtboxQuadtree.Retrive(ref m_SharedRetriveResults, bound); } public System.Func<Vector4, bool> GetRetriverByType(ColliderType type) @@ -106,6 +33,12 @@ public partial class PhysicsManager : Singleton<PhysicsManager> return null; } + public void Update() + { + m_CollisionQuadtree.UpdateQuadtree(); + m_HurtboxQuadtree.UpdateQuadtree(); + } + public void Debug() { m_CollisionQuadtree.Debug(); diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_CollisionDetection.cs b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionDetection.cs index 3436a34..a0dcc97 100644 --- a/marching/Assets/Scripts/Physics/PhysicsManager_CollisionDetection.cs +++ b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionDetection.cs @@ -48,8 +48,14 @@ public partial class PhysicsManager : Singleton<PhysicsManager> public static bool BoxVsBox(Vector4 b1, Vector4 b2) { - Vector2 intersection = new Vector2(); - return BoxVsBox(b1, b2, out intersection); + float b1w = b1.z / 2f, b1h = b1.w / 2f, b2w = b2.z / 2f, b2h = b2.w / 2f; + float distX = b2.x - b1.x; + float distY = b2.y - b1.y; + if (Mathf.Abs(distX) < b1w + b2w && Mathf.Abs(distY) < b1h + b2h) + { + return true; + } + return false; } public static bool BoxVsCircle(Vector4 box, Vector2 pos, float radius) diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs new file mode 100644 index 0000000..f372f3a --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs @@ -0,0 +1,45 @@ +using mh; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class PhysicsManager : Singleton<PhysicsManager> +{ + + private PhysicsQuadtree m_CollisionQuadtree; + + public Vector4 collisionQuadtreeRange + { + set + { + m_CollisionQuadtree.quadtreeRange = value; + } + } + + public void AddCollider(IQuadTreeObject collider) + { + m_CollisionQuadtree.AddObject(collider); + } + + public void RemoveCollider(IQuadTreeObject collider) + { + m_CollisionQuadtree.RemoveObject(collider); + } + + public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj) + { + return m_CollisionQuadtree.Retrive(ref returnObjs, obj); + } + + public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, Vector4 bound) + { + return m_CollisionQuadtree.Retrive(ref returnObjs, bound); + } + + public bool RetriveColliders(Vector4 bound) + { + m_SharedRetriveResults.Clear(); + return m_CollisionQuadtree.Retrive(ref m_SharedRetriveResults, bound); + } + +}
\ No newline at end of file diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs.meta b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs.meta new file mode 100644 index 0000000..1ac4a70 --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb174e1114e8e3d439bdb43fa7d609b8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs b/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs new file mode 100644 index 0000000..ca13935 --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs @@ -0,0 +1,40 @@ +using mh; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public partial class PhysicsManager : Singleton<PhysicsManager> +{ + + private PhysicsQuadtree m_HurtboxQuadtree; + + public Vector4 hurtboxQuadtreeRange + { + set + { + m_HurtboxQuadtree.quadtreeRange = value; + } + } + + public void AddHurtboxes(IQuadTreeObject hurtbox) + { + m_HurtboxQuadtree.AddObject(hurtbox); + } + + public void RemoveHurtbox(IQuadTreeObject hurtbox) + { + m_HurtboxQuadtree.RemoveObject(hurtbox); + } + + public bool RetriveHurtboxes(ref List<IQuadTreeObject> returnObjs, Vector4 bound) + { + return m_HurtboxQuadtree.Retrive(ref returnObjs, bound); + } + + public bool RetriveHurtboxes(Vector4 bound) + { + m_SharedRetriveResults.Clear(); + return m_HurtboxQuadtree.Retrive(ref m_SharedRetriveResults, bound); + } + +} diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs.meta b/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs.meta new file mode 100644 index 0000000..39cd699 --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fc247f3e6aafbd45a935ef4b1ced70c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs index cb17900..f4bad27 100644 --- a/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs +++ b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs @@ -16,7 +16,7 @@ class PhysicsQuadtree public PhysicsQuadtree(Vector4 range) { m_QuadtreeRange = range; - m_Quadtree = new Quadtree(0, range); + m_Quadtree = new Quadtree(0, range, true); } public void AddObject(IQuadTreeObject obj) @@ -33,17 +33,22 @@ class PhysicsQuadtree { m_Quadtree.Clear(false); m_Quadtree.Rebound(m_QuadtreeRange); + Vector4 bound = m_Quadtree.bound; for (int i = 0; i < m_Objects.Count; i++) { IQuadTreeObject obj = m_Objects[i]; - m_Quadtree.Insert(obj); + // 简单的忽略中心在边界外的object + if(PhysicsManager.IsPointInsideBox(bound, obj.bound.xy())) + { + m_Quadtree.Insert(obj); + } } } public void Debug() { Color c = Gizmos.color; - Gizmos.color = Color.red; + Gizmos.color = Color.green; m_Quadtree?.Iterate((t) => { Vector3 pos = new Vector3(t.x, t.y, 0); @@ -63,5 +68,4 @@ class PhysicsQuadtree return m_Quadtree.Retrieve(ref returnObjs, bound); } -} - +}
\ No newline at end of file diff --git a/marching/Assets/Scripts/Physics/Quadtree.cs b/marching/Assets/Scripts/Physics/Quadtree.cs index f1237ab..9f8ecba 100644 --- a/marching/Assets/Scripts/Physics/Quadtree.cs +++ b/marching/Assets/Scripts/Physics/Quadtree.cs @@ -23,14 +23,16 @@ namespace mh /// </summary> public class Quadtree { - public const int kMaxObjectsPerBlock = 5; - public const int kMaxLevel = 6; + public const int kMaxObjectsPerBlock = 4; + public const int kMaxLevel = 5; private int m_Level; private Vector4 m_Bounds; // x,y,z,w => posx,posy,width,height private Quadtree[] m_SubTrees; // Ͻǿʼʱ private List<IQuadTreeObject> m_Objects; // ǰɣκһɵĶ + private bool m_IsRoot; + public Vector4 bound { get { return m_Bounds; } } public float x { get { return m_Bounds.x; } } public float y { get { return m_Bounds.y; } } public float w { get { return m_Bounds.z; } } @@ -42,6 +44,8 @@ namespace mh public float top { get { return y + halfH; } } public float bottom { get { return y - halfH; } } + public bool isRoot { get { return m_IsRoot; } } + private static Queue<List<IQuadTreeObject>> m_QuadtreeObjPool = new Queue<List<IQuadTreeObject>>(); private static Queue<Quadtree> m_QuadtreePool = new Queue<Quadtree>(); @@ -84,12 +88,13 @@ namespace mh list = null; } - public Quadtree(int level, Vector4 bounds) + public Quadtree(int level, Vector4 bounds, bool isRoot = false) { m_Level = level; m_Bounds = bounds; m_SubTrees = new Quadtree[4]; m_Objects = QueryQuadtreeObjList(); + m_IsRoot = isRoot; } public void Rebound(Vector4 bounds) diff --git a/marching/Assets/Scripts/Physics/TestQuadtree.cs b/marching/Assets/Scripts/Physics/TestQuadtree.cs index 54ff5f6..2ea967e 100644 --- a/marching/Assets/Scripts/Physics/TestQuadtree.cs +++ b/marching/Assets/Scripts/Physics/TestQuadtree.cs @@ -18,8 +18,8 @@ namespace mh private void FixedUpdate() { var pos = UnitManager.hero.transform.position; - PhysicsManager.Instance.collisionQuadtreeRange = new Vector4(pos.x, pos.y, 50, 50); - PhysicsManager.Instance.hurtboxQuadtreeRange = new Vector4(pos.x, pos.y, 50, 50); + PhysicsManager.Instance.collisionQuadtreeRange = new Vector4(pos.x, pos.y, 30, 20); + PhysicsManager.Instance.hurtboxQuadtreeRange = new Vector4(pos.x, pos.y, 30, 20); PhysicsManager.Instance.Update(); } diff --git a/marching/Assets/Scripts/Physics/TestSpirits.cs b/marching/Assets/Scripts/Physics/TestSpirits.cs index 058f166..3f313ae 100644 --- a/marching/Assets/Scripts/Physics/TestSpirits.cs +++ b/marching/Assets/Scripts/Physics/TestSpirits.cs @@ -10,10 +10,12 @@ public class TestSpirits : MonoBehaviour public static List<SpiritScript> spirits = new List<SpiritScript>(); + private const int kMaxCount = 500; + // Start is called before the first frame update void Start() { - int count = 300 - spirits.Count; + int count = kMaxCount - spirits.Count; for (int i = 0; i < count; ++i) { float x = UnityEngine.Random.Range(-20, 10); @@ -30,7 +32,7 @@ public class TestSpirits : MonoBehaviour { while (true) { - int count = 300 - spirits.Count; + int count = kMaxCount - spirits.Count; for (int i = 0; i < count; ++i) { float x = UnityEngine.Random.Range(-20, 10); |