diff options
Diffstat (limited to 'marching/Assets/Scripts')
-rw-r--r-- | marching/Assets/Scripts/Common.meta | 8 | ||||
-rw-r--r-- | marching/Assets/Scripts/Common/Singleton.cs | 16 | ||||
-rw-r--r-- | marching/Assets/Scripts/Common/Singleton.cs.meta | 11 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/FastBoxCollider.cs | 66 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/FastCircleCollider.cs | 22 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/PhysicsManager.cs | 101 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/TestQuadtree.cs | 33 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/TestSpirits.cs | 40 | ||||
-rw-r--r-- | marching/Assets/Scripts/Physics/TestSpirits.cs.meta | 11 | ||||
-rw-r--r-- | marching/Assets/Scripts/Projectiles/BladeScript.cs | 14 | ||||
-rw-r--r-- | marching/Assets/Scripts/Unit/Characters/Samurai/SamuraiScript.cs | 8 | ||||
-rw-r--r-- | marching/Assets/Scripts/Unit/Enemies/SpiritScript.cs | 16 |
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; |