summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts
diff options
context:
space:
mode:
Diffstat (limited to 'marching/Assets/Scripts')
-rw-r--r--marching/Assets/Scripts/Common.meta8
-rw-r--r--marching/Assets/Scripts/Common/Singleton.cs16
-rw-r--r--marching/Assets/Scripts/Common/Singleton.cs.meta11
-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
-rw-r--r--marching/Assets/Scripts/Projectiles/BladeScript.cs14
-rw-r--r--marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs8
-rw-r--r--marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs16
12 files changed, 284 insertions, 62 deletions
diff --git a/marching/Assets/Scripts/Common.meta b/marching/Assets/Scripts/Common.meta
new file mode 100644
index 0000000..35d853d
--- /dev/null
+++ b/marching/Assets/Scripts/Common.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6afe070a575363345baaaaac54806dc1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/marching/Assets/Scripts/Common/Singleton.cs b/marching/Assets/Scripts/Common/Singleton.cs
new file mode 100644
index 0000000..bb382e2
--- /dev/null
+++ b/marching/Assets/Scripts/Common/Singleton.cs
@@ -0,0 +1,16 @@
+using System;
+
+public class Singleton<T> where T : class, new()
+{
+ private static T _instance;
+
+ public static T Instance
+ {
+ get
+ {
+ if (_instance == null)
+ _instance = Activator.CreateInstance<T>();
+ return _instance;
+ }
+ }
+} \ No newline at end of file
diff --git a/marching/Assets/Scripts/Common/Singleton.cs.meta b/marching/Assets/Scripts/Common/Singleton.cs.meta
new file mode 100644
index 0000000..9a9cdf7
--- /dev/null
+++ b/marching/Assets/Scripts/Common/Singleton.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 02534dc90b1e47743969d14d9386660d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
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:
diff --git a/marching/Assets/Scripts/Projectiles/BladeScript.cs b/marching/Assets/Scripts/Projectiles/BladeScript.cs
index d7d601d..90cee79 100644
--- a/marching/Assets/Scripts/Projectiles/BladeScript.cs
+++ b/marching/Assets/Scripts/Projectiles/BladeScript.cs
@@ -1,3 +1,4 @@
+using mh;
using MH;
using System;
using System.Collections;
@@ -8,6 +9,7 @@ public class BladeScript : ProjectileBase
{
[NonSerialized] public float life;
+ private static List<IQuadTreeObject> collisions = new List<IQuadTreeObject>();
private SpriteRenderer sr
{
@@ -39,6 +41,18 @@ public class BladeScript : ProjectileBase
sr.flipX = flip;
}
+ public void FixedUpdate()
+ {
+ Vector3 pos = transform.position;
+ if(PhysicsManager.Instance.RetriveColliders(ref collisions, new Vector4(pos.x, pos.y, 4, 4)))
+ {
+ for(int i =0; i < collisions.Count; i++)
+ {
+
+ }
+ }
+ }
+
private void OnTriggerEnter2D(Collider2D other)
{
Debug.Log(other.gameObject.name);
diff --git a/marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs b/marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs
index ce321d3..262c821 100644
--- a/marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs
+++ b/marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs
@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
+using Unity.VisualScripting;
using UnityEngine;
namespace MH
@@ -26,6 +27,11 @@ namespace MH
private bool m_Attacking = false;
private bool m_IsKeepAttacking = false;
+ private void Awake()
+ {
+ UnitManager.hero = this;
+ }
+
void Start()
{
m_Camera = Camera.main;
@@ -33,8 +39,6 @@ namespace MH
m_Sprite = GetComponent<SpriteRenderer>();
m_TimeSinceLastMove = float.MaxValue;
StartCoroutine(CoAttack(1f));
-
- UnitManager.hero = this;
}
protected override void Update()
diff --git a/marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs b/marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs
index d33b494..cabed35 100644
--- a/marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs
+++ b/marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs
@@ -29,6 +29,8 @@ public class SpiritScript : UnitBase
base.Awake();
collider = GetComponent<FastCircleCollider>();
m_SpriteRenderer = GetComponent<SpriteRenderer>();
+ speed = 2;
+ TestSpirits.spirits.Add(this);
}
protected override void Update()
@@ -36,7 +38,7 @@ public class SpiritScript : UnitBase
base.Update();
}
- private void FixedUpdate()
+ public void Tick()
{
UnitBase hero = UnitManager.hero;
Vector2 pos = transform.position;
@@ -48,7 +50,9 @@ public class SpiritScript : UnitBase
collisions.Clear();
bool bCollide = false;
- if (m_CollisionCheckerCount == 0 && TestQuadtree.quadtree.Retrieve(ref collisions, collider))
+ // 这个优化可能会导致穿透
+ //if (m_CollisionCheckerCount == 0 && PhysicsManager.Instance.RetriveColliders(ref collisions, collider))
+ if (/*m_CollisionCheckerCount == 0 &&*/ PhysicsManager.Instance.RetriveColliders(ref collisions, collider))
{
count = collisions.Count;
sAvg = (sCount * sAvg + count) / (float)(sCount + 1);
@@ -67,8 +71,8 @@ public class SpiritScript : UnitBase
movable = false;
Vector2 distance = collider.center - col.center;
seperate = distance.normalized * (col.radius + collider.radius - distance.magnitude); //
- dist += seperate;
dist -= (distance.normalized * dist) * distance.normalized; // 去除这个方向的位移
+ dist += seperate;
}
}
if (!movable)
@@ -84,10 +88,14 @@ public class SpiritScript : UnitBase
m_CollisionCheckerCount++;
m_CollisionCheckerCount %= 10;
}
- dist = dist.normalized * Time.deltaTime * speed; // 保持原速
+ // dist = dist.normalized * Time.deltaTime * speed; // 保持原速
transform.position += dist.ToVector3();
}
+ private void FixedUpdate()
+ {
+ }
+
public void Die()
{
Item_Coin coin = Instantiate(coinPrefab) as Item_Coin;