using mh; using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 基于图形的四叉树 /// class PhysicsQuadtree { public Vector4 quadtreeRange { set { m_QuadtreeRange = value; } } private Vector4 m_QuadtreeRange; private Quadtree m_Quadtree; private List m_Objects = new List(); public PhysicsQuadtree(Vector4 range) { m_QuadtreeRange = range; m_Quadtree = new Quadtree(0, range, true); } public void AddObject(IQuadTreeObject obj) { m_Objects.Add(obj); } public void RemoveObject(IQuadTreeObject obj) { m_Objects.Remove(obj); } public void UpdateQuadtree() { m_Quadtree.Clear(false); m_Quadtree.Rebound(m_QuadtreeRange); Vector4 bound = m_Quadtree.bound; for (int i = 0; i < m_Objects.Count; i++) { IQuadTreeObject obj = m_Objects[i]; // 简单的忽略中心在边界外的object if(PhysicsManager.IsPointInsideBox(bound, obj.bound.xy())) { m_Quadtree.Insert(obj); } } } public void Debug() { Color c = Gizmos.color; Gizmos.color = Color.green; 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; } public bool Retrive(ref List returnObjs, IQuadTreeObject obj) { return m_Quadtree.Retrieve(ref returnObjs, obj); } public bool Retrive(ref List returnObjs, Vector4 bound) { return m_Quadtree.Retrieve(ref returnObjs, bound); } }