// 绘制碰撞器到节点的映射表 private void DrawCollidersToNodes(Quadtree instance) { Dictionary <QuadtreeCollider, QuadtreeNode> collidersToNodes = GetCollidersToNodes(instance); foreach (KeyValuePair <QuadtreeCollider, QuadtreeNode> pair in collidersToNodes) { Handles.Label(pair.Key.Position, "所属节点:(" + pair.Value.Area.x + ", " + pair.Value.Area.y + ")"); } }
/// <summary> /// 将碰撞器重新存入四叉树 /// </summary> /// <param name="outOfFieldColliders"></param> private OperationResult ResetCollidersIntoQuadtree(List <QuadtreeCollider> outOfFieldColliders) { // 重新存入必定成功 OperationResult result = new OperationResult(true); // 通过包装类将碰撞器从根节点存入 foreach (QuadtreeCollider collider in outOfFieldColliders) { // 通过包装类重新存入碰撞器 OperationResult addResult = Quadtree.AddCollider(collider); // 将映射表变更合并进结果中 result.CollidersToNodes.OverlayMerge(addResult.CollidersToNodes); } // 这里并不需要担心重新存入导致分割问题,首先重新存入的是越界的,不会存入当前节点,当前节点不会分割。 // 如果存到已更新的节点,已更新的节点分割不影响操作。如果存到未更新的节点,为更新的节点分割只会在遍历到的时候把更新下发到分割出的子节点中,不会导致逻辑问题。 return(result); }
private void OnDisable() { // 将这个碰撞器从四叉树中移除 Quadtree.RemoveColliderWithMerge(this); }
private void OnEnable() { // 将这个碰撞器添加到四叉树中 Quadtree.AddCollider(this); }
/// <summary> /// 获取四叉树映射表 /// </summary> /// <returns></returns> private Dictionary <QuadtreeCollider, QuadtreeNode> GetCollidersToNodes(Quadtree instance) { return((Dictionary <QuadtreeCollider, QuadtreeNode>) typeof(Quadtree).GetField("collidersToNodes", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(instance)); }
private void OnDisable() { Quadtree.RemoveCollider(this); }
private void OnEnable() { Quadtree.AddCollider(this); }