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); InsertAllObjects(); } private void InsertAllObjects() { 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); } }