diff options
author | chai <215380520@qq.com> | 2023-05-09 18:52:28 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-05-09 18:52:28 +0800 |
commit | 4afa7c36ba9ec33ed113dcfb7cd33bd630d444f2 (patch) | |
tree | ad7260d6a1e84cd1ab56493294301df34d6bb5a6 /marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs | |
parent | f986dc197b5e093575bc0b56ee0ded991c228639 (diff) |
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs')
-rw-r--r-- | marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs b/marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs index 48af516..7b4aa1c 100644 --- a/marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs +++ b/marching/Assets/Scripts/Physics/PhysicsManager_Collide.cs @@ -19,6 +19,27 @@ public partial class PhysicsManager : Singleton<PhysicsManager> return box; } + public Vector4 GetRayBound(Vector4 line, float maxLen=20f) + { + Vector2 tr = line.xy() + maxLen * line.zw().normalized; + Vector4 bound = new Vector4(); + bound.x = (tr.x + line.x) / 2; + bound.y = (tr.y + line.y) / 2; + bound.z = Mathf.Abs(tr.x - line.x); + bound.w = Mathf.Abs(tr.y - line.y); + return bound; + } + + public Vector4 GetPointBound(Vector2 point) + { + Vector4 bound = new Vector4(); + bound.x = point.x; + bound.y = point.y; + bound.z = 1; + bound.w = 1; + return bound; + } + public ref readonly List<IQuadTreeObject> CircleCast(ColliderType target, Vector3 circle) { m_SharedCollideResults.Clear(); @@ -55,10 +76,45 @@ public partial class PhysicsManager : Singleton<PhysicsManager> public ref readonly List<IQuadTreeObject> BoxCast(ColliderType target, Vector4 box) { + m_SharedCollideResults.Clear(); + var retriver = GetRetriverByType(target); + if (retriver != null) + { + if (retriver(GetBoxBound(box))) + { + for (int i = 0; i < m_SharedRetriveResults.Count; ++i) + { + var collider = m_SharedRetriveResults[i]; + if (collider != null) + { + if (collider is FastCircleCollider) + { + if (BoxVsCircle(box, (collider as FastCircleCollider).circle)) + { + m_SharedCollideResults.Add(collider); + } + } + else if (collider is FastBoxCollider) + { + if (BoxVsBox(box, (collider as FastBoxCollider).box)) + { + m_SharedCollideResults.Add(collider); + } + } + } + } + } + } return ref m_SharedCollideResults; } - public ref readonly List<IQuadTreeObject> LineCast(ColliderType target, Vector4 line) + /// <summary> + /// x,y dir.x dir.y + /// </summary> + /// <param name="target"></param> + /// <param name="line"></param> + /// <returns></returns> + public ref readonly List<IQuadTreeObject> RayCast(ColliderType target, Vector4 ray, float maxLength = 20f) { return ref m_SharedCollideResults; } |