Skip to content

Commit 71ee202

Browse files
author
davidv-unity
committed
Updated ECSSamples
1 parent c1744f4 commit 71ee202

File tree

68 files changed

+4858
-221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+4858
-221
lines changed

ECSSamples/Assets/Advanced/Boids/Scripts/BoidConversion.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace Samples.Boids
88
{
99
[UpdateInGroup(typeof(GameObjectConversionGroup))]
10-
[ConverterVersion("macton", 4)]
10+
[ConverterVersion("macton", 5)]
1111
public class BoidConversion : GameObjectConversionSystem
1212
{
1313
protected override void OnUpdate()
@@ -29,10 +29,6 @@ protected override void OnUpdate()
2929
// Remove default transform system components
3030
DstEntityManager.RemoveComponent<Translation>(entity);
3131
DstEntityManager.RemoveComponent<Rotation>(entity);
32-
33-
// Add world render bounds components so they do not need to be added at initialization time.
34-
DstEntityManager.AddComponent(entity, ComponentType.ChunkComponent<ChunkWorldRenderBounds>());
35-
DstEntityManager.AddComponent<WorldRenderBounds>(entity);
3632
});
3733
}
3834
}

ECSSamples/Assets/Advanced/GridPath.Tests.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ECSSamples/Assets/Advanced/GridPath.Tests/CartesianGridOnCubeShortestPathTests.cs

Lines changed: 394 additions & 0 deletions
Large diffs are not rendered by default.

ECSSamples/Assets/Advanced/GridPath.Tests/CartesianGridOnCubeShortestPathTests.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
using System;
2+
using NUnit.Framework;
3+
using Unity.Collections;
4+
using Unity.Collections.LowLevel.Unsafe;
5+
using Unity.Entities.Tests;
6+
using Unity.Mathematics;
7+
8+
namespace Samples.GridPath.Tests
9+
{
10+
[TestFixture]
11+
unsafe class CartesianGridOnPlaneShortestPathTests : ECSTestsFixture
12+
{
13+
struct TestGrid : IDisposable
14+
{
15+
public int RowCount;
16+
public int ColCount;
17+
public byte* Walls;
18+
public int WallRowStride => (ColCount + 1) / 2;
19+
20+
public TestGrid(int rowCount, int colCount)
21+
{
22+
RowCount = rowCount;
23+
ColCount = colCount;
24+
25+
int wallRowStride = (colCount + 1) / 2;
26+
int wallsSize = rowCount * wallRowStride;
27+
28+
Walls = (byte*) UnsafeUtility.Malloc(wallsSize, 16, Allocator.Temp);
29+
UnsafeUtility.MemClear(Walls, wallsSize);
30+
31+
// Add outer boundary walls.
32+
for (var x = 0; x < colCount; x++)
33+
AddWallNorth(new CartesianGridCoordinates {x = (short) x, y = (short) (rowCount - 1)});
34+
for (var x = 0; x < colCount; x++)
35+
AddWallSouth(new CartesianGridCoordinates {x = (short) x, y = (short) 0});
36+
for (var y = 0; y < rowCount; y++)
37+
AddWallWest(new CartesianGridCoordinates {x = (short) 0, y = (short) y});
38+
for (var y = 0; y < rowCount; y++)
39+
AddWallEast(new CartesianGridCoordinates {x = (short) (colCount-1), y = (short) y});
40+
}
41+
42+
public void Dispose()
43+
{
44+
if (Walls != null)
45+
UnsafeUtility.Free(Walls, Allocator.Temp);
46+
}
47+
48+
public void SetWallBit(int x, int y, CartesianGridDirectionBit directionBit)
49+
{
50+
if (new CartesianGridCoordinates { x=(short)x, y=(short)y}.OnGrid(RowCount,ColCount))
51+
Walls[y * WallRowStride + (x >> 1)] |= (byte)((byte)directionBit << (4 * (x & 1)));
52+
}
53+
54+
public bool TestWallBit(int x, int y, CartesianGridDirectionBit directionBit)
55+
{
56+
if (!(new CartesianGridCoordinates {x = (short) x, y = (short) y}.OnGrid(RowCount, ColCount)))
57+
return false;
58+
59+
return (((Walls[y * WallRowStride + (x >> 1)] >> (4 * (x&1))) & (byte)directionBit) == (byte)directionBit);
60+
}
61+
62+
public void AddWallNorth(CartesianGridCoordinates cellPosition)
63+
{
64+
SetWallBit(cellPosition.x, cellPosition.y, CartesianGridDirectionBit.North);
65+
SetWallBit(cellPosition.x, cellPosition.y+1, CartesianGridDirectionBit.South);
66+
}
67+
public void AddWallSouth(CartesianGridCoordinates cellPosition)
68+
{
69+
SetWallBit(cellPosition.x, cellPosition.y, CartesianGridDirectionBit.South);
70+
SetWallBit(cellPosition.x, cellPosition.y-1, CartesianGridDirectionBit.North);
71+
}
72+
public void AddWallWest(CartesianGridCoordinates cellPosition)
73+
{
74+
SetWallBit(cellPosition.x, cellPosition.y, CartesianGridDirectionBit.West);
75+
SetWallBit(cellPosition.x-1, cellPosition.y, CartesianGridDirectionBit.East);
76+
}
77+
public void AddWallEast(CartesianGridCoordinates cellPosition)
78+
{
79+
SetWallBit(cellPosition.x, cellPosition.y, CartesianGridDirectionBit.East);
80+
SetWallBit(cellPosition.x+1, cellPosition.y, CartesianGridDirectionBit.West);
81+
}
82+
83+
int WalkPath(CartesianGridCoordinates startPosition, NativeArray<byte> targetDirections, int pathOffset)
84+
{
85+
var validDirections = CartesianGridOnPlaneShortestPath.LookupDirectionToTarget(startPosition, RowCount, ColCount, targetDirections);
86+
var direction = CartesianGridMovement.PathVariation[((pathOffset&3) * 16) + validDirections];
87+
88+
if (direction == 0xff) // No path
89+
return 0;
90+
91+
var nextPosition = new CartesianGridCoordinates();
92+
if (direction == 0)
93+
nextPosition = new CartesianGridCoordinates {x = startPosition.x, y = (short) (startPosition.y + 1)};
94+
else if (direction == 1)
95+
nextPosition = new CartesianGridCoordinates {x = startPosition.x, y = (short) (startPosition.y - 1)};
96+
else if (direction == 2)
97+
nextPosition = new CartesianGridCoordinates {x = (short)(startPosition.x-1), y = (short) startPosition.y};
98+
else if (direction == 3)
99+
nextPosition = new CartesianGridCoordinates {x = (short)(startPosition.x+1), y = (short) startPosition.y};
100+
else
101+
Assert.Fail();
102+
103+
// Test no wall in the direction given
104+
if (direction == 0)
105+
Assert.IsFalse(TestWallBit(startPosition.x, startPosition.y, CartesianGridDirectionBit.North));
106+
else if (direction == 1)
107+
Assert.IsFalse(TestWallBit(startPosition.x, startPosition.y, CartesianGridDirectionBit.South));
108+
else if (direction == 2)
109+
Assert.IsFalse(TestWallBit(startPosition.x, startPosition.y, CartesianGridDirectionBit.West));
110+
else if (direction == 3)
111+
Assert.IsFalse(TestWallBit(startPosition.x, startPosition.y, CartesianGridDirectionBit.East));
112+
113+
return 1 + WalkPath(nextPosition, targetDirections, pathOffset);
114+
}
115+
116+
public int WalkPathDistance(CartesianGridCoordinates sourcePosition, CartesianGridCoordinates targetPosition)
117+
{
118+
var directionsRowStride = (ColCount + 1) / 2;
119+
var directionsSize = RowCount * directionsRowStride;
120+
121+
var targetDirections = new NativeArray<byte>(directionsSize, Allocator.Temp);
122+
var sourceDirections= new NativeArray<byte>(directionsSize, Allocator.Temp);
123+
124+
// For testing purposes, recalculate paths every time.
125+
CartesianGridOnPlaneShortestPath.CalculateShortestPathsToTarget(targetDirections, RowCount, ColCount, targetPosition, Walls);
126+
CartesianGridOnPlaneShortestPath.CalculateShortestPathsToTarget(sourceDirections, RowCount, ColCount, sourcePosition, Walls);
127+
128+
// Test distance form source->target is same as target->source
129+
var sourceToTargetDistance = WalkPath(sourcePosition, targetDirections, 0);
130+
var targetToSourceDistance = WalkPath(targetPosition, sourceDirections, 0);
131+
Assert.AreEqual(sourceToTargetDistance, targetToSourceDistance);
132+
133+
var expectedDistance = sourceToTargetDistance;
134+
135+
// Sample path variations (not exhaustive, always follow the variation path option)
136+
for (int i = 1; i < 4; i++)
137+
{
138+
// Test distance form source->target is same as target->source
139+
// Test distance is same for all variations
140+
sourceToTargetDistance = WalkPath(sourcePosition, targetDirections, i);
141+
Assert.AreEqual(expectedDistance, sourceToTargetDistance);
142+
targetToSourceDistance = WalkPath(targetPosition, sourceDirections, i);
143+
Assert.AreEqual(expectedDistance, targetToSourceDistance);
144+
}
145+
146+
targetDirections.Dispose();
147+
sourceDirections.Dispose();
148+
149+
return expectedDistance;
150+
}
151+
}
152+
153+
[Test]
154+
public void PathOnEmptyGrid()
155+
{
156+
using (var grid = new TestGrid(16, 16))
157+
{
158+
var targetPosition = new CartesianGridCoordinates {x = 15, y = 15};
159+
var dist = 0;
160+
161+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 0, y = 0}, targetPosition);
162+
Assert.AreEqual(dist, 30 );
163+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 8, y = 7}, targetPosition);
164+
Assert.AreEqual(dist, 15 );
165+
}
166+
}
167+
168+
[Test]
169+
public void PathOnIsland()
170+
{
171+
using (var grid = new TestGrid(16, 16))
172+
{
173+
// create island left/right side
174+
for (int y = 0; y < grid.RowCount; y++)
175+
grid.AddWallWest(new CartesianGridCoordinates {x = 8, y = (short)y});
176+
177+
var targetPosition = new CartesianGridCoordinates {x = 15, y = 15};
178+
var dist = 0;
179+
180+
// right side has open path
181+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 8, y = 8}, targetPosition);
182+
Assert.AreEqual(dist, 14);
183+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 8, y = 0}, targetPosition);
184+
Assert.AreEqual(dist, 22);
185+
186+
// left side blocked
187+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 0, y = 8}, targetPosition);
188+
Assert.AreEqual(dist, 0);
189+
dist = grid.WalkPathDistance(new CartesianGridCoordinates {x = 0, y = 0}, targetPosition);
190+
Assert.AreEqual(dist, 0);
191+
}
192+
}
193+
194+
[Test]
195+
public void PathRandomObstacles()
196+
{
197+
using (var grid = new TestGrid(32, 15))
198+
{
199+
int obstacleCount = 32;
200+
var rand = new Unity.Mathematics.Random(0xF545AA3F);
201+
for (int i = 0; i < obstacleCount; i++)
202+
{
203+
var xy = rand.NextInt2(new int2(grid.ColCount, grid.RowCount));
204+
if (rand.NextBool())
205+
grid.AddWallWest(new CartesianGridCoordinates {x = (short)xy.x, y = (short)xy.y});
206+
else
207+
grid.AddWallSouth(new CartesianGridCoordinates {x = (short)xy.x, y = (short)xy.y});
208+
}
209+
210+
int testCount = 64;
211+
for (int i = 0; i < testCount; i++)
212+
{
213+
var sourceXY = rand.NextInt2(new int2(grid.ColCount, grid.RowCount));
214+
var targetXY = rand.NextInt2(new int2(grid.ColCount, grid.RowCount));
215+
var sourcePosition = new CartesianGridCoordinates {x = (short)sourceXY.x, y = (short)sourceXY.y};
216+
var targetPosition = new CartesianGridCoordinates {x = (short)targetXY.x, y = (short)targetXY.y};
217+
grid.WalkPathDistance(sourcePosition, targetPosition);
218+
}
219+
}
220+
}
221+
}
222+
}

ECSSamples/Assets/Advanced/GridPath.Tests/CartesianGridOnPlaneShortestPathTests.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "Samples.GridPath.Tests",
3+
"references": [
4+
"Unity.Entities",
5+
"Unity.Collections",
6+
"Unity.Jobs",
7+
"Unity.Burst",
8+
"Unity.Mathematics",
9+
"Unity.Transforms",
10+
"Unity.Entities.Tests",
11+
"Samples.GridPath"
12+
],
13+
"optionalUnityReferences": [
14+
"TestAssemblies"
15+
],
16+
"includePlatforms": [
17+
"Editor"
18+
],
19+
"excludePlatforms": [],
20+
"allowUnsafeCode": true,
21+
"overrideReferences": false,
22+
"precompiledReferences": [],
23+
"autoReferenced": true,
24+
"defineConstraints": [],
25+
"versionDefines": []
26+
}
27+

ECSSamples/Assets/Advanced/GridPath.Tests/Samples.GridPath.Tests.asmdef.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ECSSamples/Assets/Advanced/GridPath/Assets/BasicActor0.prefab

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ GameObject:
1414
- component: {fileID: 3139632156233265087}
1515
- component: {fileID: 8085697106929772112}
1616
m_Layer: 0
17-
m_Name: BasicActor
17+
m_Name: BasicActor0
1818
m_TagString: Untagged
1919
m_Icon: {fileID: 0}
2020
m_NavMeshLayer: 0
@@ -106,5 +106,5 @@ MonoBehaviour:
106106
m_Script: {fileID: 11500000, guid: ede02fc5d83e4273ad9b2b008f644a5a, type: 3}
107107
m_Name:
108108
m_EditorClassIdentifier:
109-
Version: 3-macton
110109
Speed: 1.53
110+
Movement: 0

ECSSamples/Assets/Advanced/GridPath/Assets/BasicActor1 Variant.prefab

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,10 @@ PrefabInstance:
7777
propertyPath: Speed
7878
value: 1.93
7979
objectReference: {fileID: 0}
80+
- target: {fileID: 8085697106929772112, guid: 185fc72fe6b8347aa833fe241a0dd4de,
81+
type: 3}
82+
propertyPath: Movement
83+
value: 0
84+
objectReference: {fileID: 0}
8085
m_RemovedComponents: []
8186
m_SourcePrefab: {fileID: 100100000, guid: 185fc72fe6b8347aa833fe241a0dd4de, type: 3}

0 commit comments

Comments
 (0)