/// <summary> /// 案例1:添加N个任意朝向的矩形区域,并开启寻路 /// (拖动StartPos或EndPos对象开启寻路) /// </summary> void Case1() { _case = 5; _quadTree = new NativeQuadTree(new float4(0, 0, MapSize, MapSize), Resolution, 1, Allocator.Persistent); for (var i = 0; i < ObjectCount; i++) { var size = new float2(Random.Range(1, ObjectSize), Random.Range(1, ObjectSize)); var pos = new float2(Random.Range(-MapSize / 2, MapSize / 2), Random.Range(-MapSize / 2, MapSize / 2)); var forward = math.normalizesafe(new float2(Random.Range(-1f, 1f), Random.Range(-1f, 1f))); if (math.lengthsq(forward) < 0.1f) { forward = new float2(0, 1); } _quadTree.AddRectObject(in size, in pos, forward, 1, Offset); if (Debug) { var obj = Instantiate(Cube); obj.hideFlags = HideFlags.HideInInspector | HideFlags.HideInHierarchy; obj.name = "Cube:" + i; obj.transform.position = new Vector3(pos.x, 0, pos.y); obj.transform.localScale = new Vector3(size.x * 2, 1, size.y * 2); obj.transform.rotation = quaternion.LookRotation(new float3(forward.x, 0, forward.y), new float3(0, 1, 0)); } } _quadTree.Output(1000); _startPos = new GameObject("StartPos"); _endPos = new GameObject("EndPos"); _player = Instantiate(Cube); _player.name = "Player"; }
public void InsertTriggerDivideNonBurstBulk() { var values = GetValues(); var positions = new NativeArray <float2>(values.Length, Allocator.TempJob); var quadTree = new NativeQuadTree <int>(Bounds); positions.CopyFrom(values); NativeArray <QuadElement <int> > elements = new NativeArray <QuadElement <int> >(positions.Length, Allocator.Temp); for (int i = 0; i < positions.Length; i++) { elements[i] = new QuadElement <int> { pos = positions[i], element = i }; } var s = Stopwatch.StartNew(); quadTree.ClearAndBulkInsert(elements); s.Stop(); Debug.Log(s.Elapsed.TotalMilliseconds); QuadTreeDrawer.Draw(quadTree); quadTree.Dispose(); positions.Dispose(); }
public void RangeQueryAfterBulk() { var values = GetValues(); NativeArray <QuadElement <int> > elements = new NativeArray <QuadElement <int> >(values.Length, Allocator.TempJob); for (int i = 0; i < values.Length; i++) { elements[i] = new QuadElement <int> { pos = values[i], element = i }; } var quadTree = new NativeQuadTree <int>(Bounds); quadTree.ClearAndBulkInsert(elements); var queryJob = new QuadTreeJobs.RangeQueryJob <int> { QuadTree = quadTree, Bounds = new AABB2D(100, 140), Results = new NativeList <QuadElement <int> >(1000, Allocator.TempJob) }; var s = Stopwatch.StartNew(); queryJob.Run(); s.Stop(); Debug.Log(s.Elapsed.TotalMilliseconds + " result: " + queryJob.Results.Length); QuadTreeDrawer.DrawWithResults(queryJob); quadTree.Dispose(); elements.Dispose(); queryJob.Results.Dispose(); }
public static void Draw <T>(NativeQuadTree <T> quadTree) where T : unmanaged { QuadTreeDrawer window = (QuadTreeDrawer)GetWindow(typeof(QuadTreeDrawer)); window.DoDraw(quadTree, default, default);