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/FastBoxCollider.cs66
-rw-r--r--marching/Assets/Scripts/Physics/FastCircleCollider.cs22
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsManager.cs101
-rw-r--r--marching/Assets/Scripts/Physics/TestQuadtree.cs33
-rw-r--r--marching/Assets/Scripts/Physics/TestSpirits.cs40
-rw-r--r--marching/Assets/Scripts/Physics/TestSpirits.cs.meta11
6 files changed, 217 insertions, 56 deletions
diff --git a/marching/Assets/Scripts/Physics/FastBoxCollider.cs b/marching/Assets/Scripts/Physics/FastBoxCollider.cs
index 4f20b81..7b52caf 100644
--- a/marching/Assets/Scripts/Physics/FastBoxCollider.cs
+++ b/marching/Assets/Scripts/Physics/FastBoxCollider.cs
@@ -1,18 +1,68 @@
+using mh;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
-public class FastBoxCollider : MonoBehaviour
+public class FastBoxCollider : MonoBehaviour, IQuadTreeObject
{
- // Start is called before the first frame update
- void Start()
+
+ [SerializeField] private ColliderType m_Type;
+ [SerializeField] private Vector2 m_Offset;
+ [SerializeField] private Vector2 m_Size;
+
+ public Vector2 center
+ {
+ get
+ {
+ Vector3 pos = transform.position + m_Offset.ToVector3();
+ return pos;
+ }
+ }
+
+ public Vector2 offset => m_Offset;
+ public Vector2 size => m_Size;
+
+ public Vector4 bound
+ {
+ get
+ {
+ Vector3 pos = transform.position + m_Offset.ToVector3();
+ Vector4 b = new Vector4();
+ b.x = pos.x;
+ b.y = pos.y;
+ b.z = size.x;
+ b.w = size.y;
+ return b;
+ }
+ }
+
+ public void Awake()
+ {
+ if (m_Type == ColliderType.Collider)
+ {
+ PhysicsManager.Instance.AddCollider(this);
+ }
+ else if (m_Type == ColliderType.Hurtbox)
+ {
+ PhysicsManager.Instance.AddHurtboxes(this);
+ }
+ }
+
+ public void OnDestroy()
{
-
+ if (m_Type == ColliderType.Collider)
+ {
+ PhysicsManager.Instance.RemoveCollider(this);
+ }
+ else if (m_Type == ColliderType.Hurtbox)
+ {
+ PhysicsManager.Instance.RemoveHurtbox(this);
+ }
}
- // Update is called once per frame
- void Update()
+ private void OnDrawGizmos()
{
-
+ Gizmos.DrawWireCube(transform.position + m_Offset.ToVector3(), m_Size.ToVector3());
}
-}
+
+} \ No newline at end of file
diff --git a/marching/Assets/Scripts/Physics/FastCircleCollider.cs b/marching/Assets/Scripts/Physics/FastCircleCollider.cs
index 753aa1c..5884a69 100644
--- a/marching/Assets/Scripts/Physics/FastCircleCollider.cs
+++ b/marching/Assets/Scripts/Physics/FastCircleCollider.cs
@@ -6,6 +6,7 @@ using UnityEngine;
public class FastCircleCollider : MonoBehaviour, IQuadTreeObject
{
+ [SerializeField] private ColliderType m_Type;
[SerializeField] private float m_Radius;
[SerializeField] private Vector2 m_Offset;
@@ -38,15 +39,26 @@ public class FastCircleCollider : MonoBehaviour, IQuadTreeObject
public void Awake()
{
- PhysicsManager.quadTreeObjects.Add(this);
- Debug.Log(PhysicsManager.quadTreeObjects.Count);
- m_Offset = Vector2.zero;
- m_Radius = 0.3f;
+ if(m_Type == ColliderType.Collider)
+ {
+ PhysicsManager.Instance.AddCollider(this);
+ }
+ else if(m_Type == ColliderType.Hurtbox)
+ {
+ PhysicsManager.Instance.AddHurtboxes(this);
+ }
}
public void OnDestroy()
{
- PhysicsManager.quadTreeObjects.Remove(this);
+ if (m_Type == ColliderType.Collider)
+ {
+ PhysicsManager.Instance.RemoveCollider(this);
+ }
+ else if (m_Type == ColliderType.Hurtbox)
+ {
+ PhysicsManager.Instance.RemoveHurtbox(this);
+ }
}
private void OnDrawGizmos()
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
diff --git a/marching/Assets/Scripts/Physics/TestQuadtree.cs b/marching/Assets/Scripts/Physics/TestQuadtree.cs
index 3159853..1cbb64d 100644
--- a/marching/Assets/Scripts/Physics/TestQuadtree.cs
+++ b/marching/Assets/Scripts/Physics/TestQuadtree.cs
@@ -10,47 +10,22 @@ namespace mh
[DefaultExecutionOrder(-1000)]
public class TestQuadtree : MonoBehaviour
{
- public static mh.Quadtree m_Quadtree;
- public static mh.Quadtree quadtree { get { return m_Quadtree; } }
private void Awake()
{
- m_Quadtree = new Quadtree(0, new Vector4(0, 0, 30, 30));
- }
-
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- // Update is called once per frame
- void Update()
- {
}
private void FixedUpdate()
{
- m_Quadtree.Clear(false);
var pos = UnitManager.hero.transform.position;
- m_Quadtree.Rebound(new Vector4(pos.x, pos.y, 50, 50));
- var objs = PhysicsManager.quadTreeObjects;
- for (int i = 0; i < objs.Count; ++i)
- {
- TestQuadtree.quadtree.Insert(objs[i]);
- }
+ PhysicsManager.Instance.quadtreeCollisionRange = new Vector4(pos.x, pos.y, 50, 50);
+ PhysicsManager.Instance.quadtreeHurtboxRange = new Vector4(pos.x, pos.y, 50, 50);
+ PhysicsManager.Instance.Update();
}
private void OnDrawGizmos()
{
- 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;
+ PhysicsManager.Instance.Debug();
}
}
diff --git a/marching/Assets/Scripts/Physics/TestSpirits.cs b/marching/Assets/Scripts/Physics/TestSpirits.cs
new file mode 100644
index 0000000..347fc42
--- /dev/null
+++ b/marching/Assets/Scripts/Physics/TestSpirits.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UIElements;
+
+public class TestSpirits : MonoBehaviour
+{
+ public SpiritScript prefab;
+
+ public static List<SpiritScript> spirits = new List<SpiritScript>();
+
+ // Start is called before the first frame update
+ void Start()
+ {
+
+ for (int i = 0; i < 300; ++i)
+ {
+ float x = UnityEngine.Random.Range(-20, 10);
+ float y = UnityEngine.Random.Range(-20, 10);
+ SpiritScript go = Instantiate(prefab) as SpiritScript;
+ go.transform.position = new Vector3(x, y, 0);
+ go.transform.parent = this.transform;
+ }
+ }
+
+ // Update is called once per frame
+ void Update()
+ {
+ }
+
+ private void FixedUpdate()
+ {
+ for(int i = 0; i < spirits.Count; ++i)
+ {
+ spirits[i].Tick();
+ }
+ }
+
+}
diff --git a/marching/Assets/Scripts/Physics/TestSpirits.cs.meta b/marching/Assets/Scripts/Physics/TestSpirits.cs.meta
new file mode 100644
index 0000000..479bb7a
--- /dev/null
+++ b/marching/Assets/Scripts/Physics/TestSpirits.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 339ab6a313449b84fb9f51c3b6a1980b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: