summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'marching/Assets/Scripts/Physics')
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager.cs81
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager_CollisionDetection.cs10
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs45
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager_CollisionTree.cs.meta11
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs40
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager_HurtboxTree.cs.meta11
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsQuadtree.cs14
-rw-r--r--marching/Assets/Scripts/Physics/Quadtree.cs11
-rw-r--r--marching/Assets/Scripts/Physics/TestQuadtree.cs4
-rw-r--r--marching/Assets/Scripts/Physics/TestSpirits.cs6
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);