using mh; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting.Antlr3.Runtime.Tree; using UnityEngine; using UnityEngine.UIElements; /// /// 物理查询 /// public partial class PhysicsManager : Singleton { // 碰撞检测结果 private List m_SharedCollideResults = new List(); public static Vector4 GetCircleBound(Vector3 circle) { float size = circle.z * 2; return new Vector4(circle.x, circle.y, size, size); } public static Vector4 GetBoxBound(Vector4 box) { return box; } public static Vector4 GetRayBound(Vector4 ray) { Vector2 tr = ray.xy() + ray.zw(); Vector4 bound = new Vector4(); bound.x = (tr.x + ray.x) / 2; bound.y = (tr.y + ray.y) / 2; bound.z = Mathf.Max(Mathf.Abs(tr.x - ray.x), 1); bound.w = Mathf.Max(Mathf.Abs(tr.y - ray.y), 1); return bound; } public static Vector4 GetRaySegment(Vector4 ray) { Vector2 tr = ray.xy() + ray.zw(); Vector4 seg = new Vector4(); seg.x = ray.x; seg.y = ray.y; seg.z = tr.x; seg.w = tr.y; return seg; } public static Vector4 GetPointBound(Vector2 point) { Vector4 bound = new Vector4(); bound.x = point.x; bound.y = point.y; bound.z = 1; bound.w = 1; return bound; } /// /// 把x,y,w,h的box转换为lowerx,higherx,lowery,highery /// /// public static Vector4 GetBoxRange(Vector4 box) { Vector4 Range = new(); Range.x = box.x - box.z / 2; Range.y = box.x + box.z / 2; Range.z = box.y - box.w / 2; Range.w = box.y + box.w / 2; return Range; } public ref readonly List CircleCast(ColliderType target, Vector3 circle) { m_SharedCollideResults.Clear(); var retriver = GetRetriverByType(target); if(retriver != null) { if (retriver(GetCircleBound(circle))) { for(int i = 0; i < m_SharedRetriveResults.Count; ++i) { var collider = m_SharedRetriveResults[i]; if(collider != null) { if(collider is FastCircleCollider) { if(CircleVsCircle((collider as FastCircleCollider).circle, circle)) { m_SharedCollideResults.Add(collider); } } else if(collider is FastBoxCollider) { if (BoxVsCircle((collider as FastBoxCollider).box, circle)) { m_SharedCollideResults.Add(collider); } } } } } } return ref m_SharedCollideResults; } public ref readonly List 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; } /// /// x,y dir.x dir.y(dir带长度) /// /// /// /// public ref readonly List RayCast(ColliderType target, Vector4 ray) { m_SharedCollideResults.Clear(); var retriver = GetRetriverByType(target); if(retriver != null) { if(retriver(GetRayBound(ray))) { for (int i = 0; i < m_SharedRetriveResults.Count; ++i) { var collider = m_SharedRetriveResults[i]; if (collider != null) { if (collider is FastCircleCollider) { if (RayVsCircle(ray, (collider as FastCircleCollider).circle)) { m_SharedCollideResults.Add(collider); } } else if (collider is FastBoxCollider) { if (RayVsBox(ray, (collider as FastBoxCollider).box)) { m_SharedCollideResults.Add(collider); } } } } } } return ref m_SharedCollideResults; } public ref readonly List PointCast(ColliderType target, Vector2 point) { return ref m_SharedCollideResults; } }