From 38e177b0fdf130d6a361ab51c80b5b56ee83f28e Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Fri, 26 May 2023 19:12:36 +0800 Subject: *misc --- .../Assets/Scripts/Physics/FastBoxCollider.cs | 8 +++++ .../Assets/Scripts/Physics/FastCircleCollider.cs | 8 +++++ .../Assets/Scripts/Physics/PhysicsManager.cs | 4 ++- .../Scripts/Physics/PhysicsManager_StaticTree.cs | 38 ++++++++++++++++++++++ .../Assets/Scripts/Physics/PhysicsQuadtree.cs | 3 ++ .../Assets/Scripts/Physics/TestSpirits.cs | 1 - 6 files changed, 60 insertions(+), 2 deletions(-) (limited to 'WorldlineKeepers/Assets/Scripts/Physics') diff --git a/WorldlineKeepers/Assets/Scripts/Physics/FastBoxCollider.cs b/WorldlineKeepers/Assets/Scripts/Physics/FastBoxCollider.cs index df84e0d..a644b69 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/FastBoxCollider.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/FastBoxCollider.cs @@ -60,6 +60,10 @@ public class FastBoxCollider : MonoBehaviour, IQuadTreeObject { PhysicsManager.Instance.AddHurtboxes(this); } + else if (m_Type == ColliderType.StaticCollider) + { + PhysicsManager.Instance.AddStaticCollider(this); + } } public void OnDestroy() @@ -72,6 +76,10 @@ public class FastBoxCollider : MonoBehaviour, IQuadTreeObject { PhysicsManager.Instance.RemoveHurtbox(this); } + else if (m_Type == ColliderType.StaticCollider) + { + PhysicsManager.Instance.RemoveStaticCollider(this); + } } private void OnDrawGizmos() diff --git a/WorldlineKeepers/Assets/Scripts/Physics/FastCircleCollider.cs b/WorldlineKeepers/Assets/Scripts/Physics/FastCircleCollider.cs index dde49f9..5f04a9f 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/FastCircleCollider.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/FastCircleCollider.cs @@ -60,6 +60,10 @@ public class FastCircleCollider : MonoBehaviour, IQuadTreeObject { PhysicsManager.Instance.AddHurtboxes(this); } + else if(m_Type == ColliderType.StaticCollider) + { + PhysicsManager.Instance.AddStaticCollider(this); + } } public void OnDestroy() @@ -72,6 +76,10 @@ public class FastCircleCollider : MonoBehaviour, IQuadTreeObject { PhysicsManager.Instance.RemoveHurtbox(this); } + else if(m_Type == ColliderType.StaticCollider) + { + PhysicsManager.Instance.RemoveStaticCollider(this); + } } private void OnDrawGizmos() diff --git a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager.cs b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager.cs index b726d6b..182ea16 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager.cs @@ -8,11 +8,11 @@ public enum ColliderType { Collider, Hurtbox, + StaticCollider, } public partial class PhysicsManager : Singleton { - // 四叉树筛选结果 public List sharedRetriveResults => m_SharedRetriveResults; private List m_SharedRetriveResults = new List(); @@ -28,6 +28,8 @@ public partial class PhysicsManager : Singleton return RetriveColliders; else if (type == ColliderType.Hurtbox) return RetriveHurtboxes; + else if (type == ColliderType.StaticCollider) + return RetriveStaticColliders; else return null; } diff --git a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager_StaticTree.cs b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager_StaticTree.cs index c759e32..b89da29 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager_StaticTree.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsManager_StaticTree.cs @@ -1,10 +1,48 @@ +using mh; using System.Collections; using System.Collections.Generic; using UnityEngine; +/// +/// 不经常改变位置和大小的collider认为是静态collider,不会每帧重建 +/// public partial class PhysicsManager : Singleton { + private PhysicsQuadtree m_StaticCollisionQuadtree; + public Vector4 staticCollisionQuadtreeRange + { + set + { + m_StaticCollisionQuadtree.quadtreeRange = value; + } + } + + public void AddStaticCollider(IQuadTreeObject collider) + { + m_StaticCollisionQuadtree.AddObject(collider); + } + + public void RemoveStaticCollider(IQuadTreeObject collider) + { + m_StaticCollisionQuadtree.RemoveObject(collider); + } + + public bool RetriveStaticColliders(ref List returnObjs, IQuadTreeObject obj) + { + return m_StaticCollisionQuadtree.Retrive(ref returnObjs, obj); + } + + public bool RetriveStaticColliders(ref List returnObjs, Vector4 bound) + { + return m_StaticCollisionQuadtree.Retrive(ref returnObjs, bound); + } + + public bool RetriveStaticColliders(Vector4 bound) + { + m_SharedRetriveResults.Clear(); + return m_StaticCollisionQuadtree.Retrive(ref m_SharedRetriveResults, bound); + } } diff --git a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs index 5cd374e..9fa8c2f 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs @@ -40,6 +40,9 @@ class PhysicsQuadtree m_Objects.Remove(obj); } + /// + /// 閲嶅缓鍥涘弶鏍 + /// public void UpdateQuadtree() { m_Quadtree.Clear(false); diff --git a/WorldlineKeepers/Assets/Scripts/Physics/TestSpirits.cs b/WorldlineKeepers/Assets/Scripts/Physics/TestSpirits.cs index 3f313ae..8e46d3d 100644 --- a/WorldlineKeepers/Assets/Scripts/Physics/TestSpirits.cs +++ b/WorldlineKeepers/Assets/Scripts/Physics/TestSpirits.cs @@ -12,7 +12,6 @@ public class TestSpirits : MonoBehaviour private const int kMaxCount = 500; - // Start is called before the first frame update void Start() { int count = kMaxCount - spirits.Count; -- cgit v1.1-26-g67d0