698 lines
28 KiB
C#
698 lines
28 KiB
C#
#region "Imports"
|
|
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using RoadArchitect.Roads;
|
|
#endregion
|
|
|
|
|
|
namespace RoadArchitect.Tests
|
|
{
|
|
#if UNITY_EDITOR
|
|
public static class UnitTests
|
|
{
|
|
private static RoadSystem roadSystem;
|
|
|
|
|
|
/// <summary> WARNING: You should only call this on an empty scene. The RoadArchitect team is not responsbile for loss of data or work if this function is called by user. </summary>
|
|
public static void RoadArchitectUnitTests()
|
|
{
|
|
CleanupAllTests();
|
|
|
|
//Create new road system and turn off updates:
|
|
GameObject roadSystemObject = new GameObject("RoadArchitectSystem1");
|
|
//Add road system component.
|
|
roadSystem = roadSystemObject.AddComponent<RoadSystem>();
|
|
roadSystem.isAllowingRoadUpdates = false;
|
|
|
|
int numTests = 10;
|
|
double totalTestTime = 0f;
|
|
for (int index = 1; index <= numTests; index++)
|
|
{
|
|
UnityEngine.Debug.Log("Running test " + index);
|
|
double testTime = RunTest(index);
|
|
totalTestTime += testTime;
|
|
UnityEngine.Debug.Log("Test " + index + " complete. Test time: " + testTime + "ms");
|
|
}
|
|
UnityEngine.Debug.Log("All tests completed. Total test time: " + totalTestTime + "ms");
|
|
|
|
//Turn updates back on and update road:
|
|
roadSystem.isAllowingRoadUpdates = true;
|
|
roadSystem.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
public static void RoadArchitectUnitTest1To5()
|
|
{
|
|
CleanupTest(1);
|
|
|
|
//Create new road system and turn off updates:
|
|
GameObject roadSystemObject = new GameObject("RoadArchitectSystem1");
|
|
//Add road system component.
|
|
roadSystem = roadSystemObject.AddComponent<RoadSystem>();
|
|
roadSystem.isAllowingRoadUpdates = false;
|
|
|
|
int numTests = 5;
|
|
double totalTestTime = 0f;
|
|
for (int index = 1; index <= numTests; index++)
|
|
{
|
|
UnityEngine.Debug.Log("Running test " + index);
|
|
double testTime = RunTest(index);
|
|
totalTestTime += testTime;
|
|
UnityEngine.Debug.Log("Test " + index + " complete. Test time: " + testTime + "ms");
|
|
}
|
|
UnityEngine.Debug.Log("All tests completed. Total test time: " + totalTestTime + "ms");
|
|
|
|
//Turn updates back on and update road:
|
|
roadSystem.isAllowingRoadUpdates = true;
|
|
roadSystem.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
private static long RunTest(int _testID)
|
|
{
|
|
System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();
|
|
switch (_testID)
|
|
{
|
|
case 1:
|
|
//Bridges
|
|
RoadArchitectUnitTest1();
|
|
break;
|
|
case 2:
|
|
//2L intersections
|
|
RoadArchitectUnitTest2();
|
|
break;
|
|
case 3:
|
|
//4L intersections
|
|
RoadArchitectUnitTest3();
|
|
break;
|
|
case 4:
|
|
//Large suspension bridge
|
|
RoadArchitectUnitTest4();
|
|
break;
|
|
case 5:
|
|
//Long road:
|
|
RoadArchitectUnitTest5();
|
|
break;
|
|
case 6:
|
|
//Very Long road:
|
|
RoadArchitectUnitTest6();
|
|
break;
|
|
case 7:
|
|
// Double intersection:
|
|
RoadArchitectUnitTest7();
|
|
break;
|
|
case 8:
|
|
// Road loop:
|
|
RoadArchitectUnitTest8();
|
|
break;
|
|
case 9:
|
|
// 3 Intersections with end nodes
|
|
RoadArchitectUnitTest9();
|
|
break;
|
|
case 10:
|
|
// Road Intersection with itself
|
|
RoadArchitectUnitTest10();
|
|
break;
|
|
}
|
|
stopwatch.Stop();
|
|
long testTime = stopwatch.ElapsedMilliseconds;
|
|
return testTime;
|
|
}
|
|
|
|
|
|
public static void CleanupAllTests()
|
|
{
|
|
Debug.Log("Cleaning up tests");
|
|
CleanupTest(1);
|
|
|
|
CleanupTest(6);
|
|
CleanupTest(7);
|
|
CleanupTest(8);
|
|
CleanupTest(9);
|
|
CleanupTest(10);
|
|
}
|
|
|
|
|
|
public static void CleanupTest(int _index)
|
|
{
|
|
//Get the existing road system, if it exists:
|
|
GameObject roadSystem = (GameObject)GameObject.Find("RoadArchitectSystem" + _index);
|
|
DestroyTerrainHistory(roadSystem);
|
|
Object.DestroyImmediate(roadSystem);
|
|
FlattenTerrains();
|
|
}
|
|
|
|
|
|
private static void DestroyTerrainHistory(GameObject _roadSystem)
|
|
{
|
|
//Destroy the terrain histories:
|
|
if (_roadSystem != null)
|
|
{
|
|
Road[] roads = _roadSystem.GetComponents<Road>();
|
|
foreach (Road road in roads)
|
|
{
|
|
Terraforming.TerrainsReset(road);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary> Reset all terrains to 0,0 </summary>
|
|
private static void FlattenTerrains()
|
|
{
|
|
Terrain[] allTerrains = Object.FindObjectsOfType<Terrain>();
|
|
foreach (Terrain terrain in allTerrains)
|
|
{
|
|
terrain.terrainData.SetHeights(0, 0, new float[513, 513]);
|
|
}
|
|
}
|
|
|
|
|
|
private static void RoadArchitectUnitTest1()
|
|
{
|
|
//Create node locations:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
int maxCount = 18;
|
|
float mod = 100f;
|
|
Vector3 vector = new Vector3(50f, 40f, 50f);
|
|
for (int index = 0; index < maxCount; index++)
|
|
{
|
|
//tLocs.Add(xVect + new Vector3(tMod * Mathf.Pow((float)i / ((float)MaxCount * 0.15f), 2f), 1f*((float)i*1.25f), tMod * i));
|
|
nodeLocations.Add(vector + new Vector3(mod * Mathf.Pow((float)index / ((float)25 * 0.15f), 2f), 0f, mod * index));
|
|
}
|
|
|
|
//Get road system create road:
|
|
Road testRoad = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
|
|
//Bridge0: (Arch)
|
|
testRoad.spline.nodes[4].isBridgeStart = true;
|
|
testRoad.spline.nodes[4].isBridgeMatched = true;
|
|
testRoad.spline.nodes[7].isBridgeEnd = true;
|
|
testRoad.spline.nodes[7].isBridgeMatched = true;
|
|
testRoad.spline.nodes[4].bridgeCounterpartNode = testRoad.spline.nodes[7];
|
|
testRoad.spline.nodes[4].LoadWizardObjectsFromLibrary("Arch12m-2L", true, true);
|
|
|
|
//Bridge1: (Federal causeway)
|
|
testRoad.spline.nodes[8].isBridgeStart = true;
|
|
testRoad.spline.nodes[8].isBridgeMatched = true;
|
|
testRoad.spline.nodes[8].bridgeCounterpartNode = testRoad.spline.nodes[10];
|
|
testRoad.spline.nodes[8].LoadWizardObjectsFromLibrary("Causeway1-2L", true, true);
|
|
testRoad.spline.nodes[10].isBridgeEnd = true;
|
|
testRoad.spline.nodes[10].isBridgeMatched = true;
|
|
|
|
//Bridge2: (Steel)
|
|
testRoad.spline.nodes[11].isBridgeStart = true;
|
|
testRoad.spline.nodes[11].isBridgeMatched = true;
|
|
testRoad.spline.nodes[11].bridgeCounterpartNode = testRoad.spline.nodes[13];
|
|
testRoad.spline.nodes[11].LoadWizardObjectsFromLibrary("Steel-2L", true, true);
|
|
testRoad.spline.nodes[13].isBridgeEnd = true;
|
|
testRoad.spline.nodes[13].isBridgeMatched = true;
|
|
|
|
//Bridge3: (Causeway)
|
|
testRoad.spline.nodes[14].isBridgeStart = true;
|
|
testRoad.spline.nodes[14].isBridgeMatched = true;
|
|
testRoad.spline.nodes[16].isBridgeEnd = true;
|
|
testRoad.spline.nodes[16].isBridgeMatched = true;
|
|
testRoad.spline.nodes[14].bridgeCounterpartNode = testRoad.spline.nodes[16];
|
|
testRoad.spline.nodes[14].LoadWizardObjectsFromLibrary("Causeway4-2L", true, true);
|
|
}
|
|
|
|
|
|
/// <summary> Create 2L intersections: </summary>
|
|
private static void RoadArchitectUnitTest2()
|
|
{
|
|
//Create node locations:
|
|
float startLocX = 800f;
|
|
float startLocY = 200f;
|
|
float startLocYSep = 200f;
|
|
float height = 20f;
|
|
Road road1 = null;
|
|
Road road2 = null;
|
|
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
for (int index = 0; index < 9; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (index * 200f), height, 600f));
|
|
}
|
|
road1 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
|
|
//Get road system, create road #1:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX, height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
//UnitTest_IntersectionHelper(bRoad, tRoad, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Get road system, create road #2:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 2f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
//UnitTest_IntersectionHelper(bRoad, tRoad, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.TurnLane);
|
|
|
|
//Get road system, create road #3:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 4f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
//UnitTest_IntersectionHelper(bRoad, tRoad, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.BothTurnLanes);
|
|
|
|
//Get road system, create road #4:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 6f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
//UnitTest_IntersectionHelper(bRoad, tRoad, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.TurnLane);
|
|
|
|
//Get road system, create road #4:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 8f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
//UnitTest_IntersectionHelper(bRoad, tRoad, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.TurnLane);
|
|
|
|
RoadAutomation.CreateIntersectionsProgrammaticallyForRoad(road1, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Now count road intersections, if not 5 throw error
|
|
int intersctionsCount = 0;
|
|
foreach (SplineN node in road1.spline.nodes)
|
|
{
|
|
if (node.isIntersection)
|
|
{
|
|
intersctionsCount += 1;
|
|
}
|
|
}
|
|
|
|
if (intersctionsCount != 5)
|
|
{
|
|
Debug.LogError("Unit Test #2 failed: " + intersctionsCount.ToString() + " intersections instead of 5.");
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary> This will create an intersection if two nodes overlap on the road. Only good if the roads only overlap once. </summary>
|
|
private static void UnitTestIntersectionHelper(Road _road1, Road _road2, RoadIntersection.iStopTypeEnum _iStopType, RoadIntersection.RoadTypeEnum _roadType)
|
|
{
|
|
SplineN nodeInter1 = null;
|
|
SplineN nodeInter2 = null;
|
|
|
|
// Loop through every node of _road1 and _road2
|
|
// Finds the first nodes which are close enough for a intersection
|
|
foreach (SplineN node in _road1.spline.nodes)
|
|
{
|
|
foreach (SplineN node2 in _road2.spline.nodes)
|
|
{
|
|
if (RootUtils.IsApproximately(Vector3.Distance(node.transform.position, node2.transform.position), 0f, 0.05f))
|
|
{
|
|
nodeInter1 = node;
|
|
nodeInter2 = node2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (nodeInter1 != null && nodeInter2 != null)
|
|
{
|
|
GameObject IntersectionsObject = Intersections.CreateIntersection(nodeInter1, nodeInter2);
|
|
RoadIntersection roadIntersction = IntersectionsObject.GetComponent<RoadIntersection>();
|
|
roadIntersction.intersectionStopType = _iStopType;
|
|
roadIntersction.roadType = _roadType;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary> Create 4L intersections: </summary>
|
|
private static void RoadArchitectUnitTest3()
|
|
{
|
|
//Create node locations:
|
|
float startLocX = 200f;
|
|
float startLocY = 2500f;
|
|
float startLocYSep = 300f;
|
|
float height = 20f;
|
|
Road road1;
|
|
Road road2;
|
|
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
for (int index = 0; index < 9; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (index * startLocYSep), height, startLocY + (startLocYSep * 2f)));
|
|
}
|
|
road1 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road1.laneAmount = 4;
|
|
|
|
|
|
//Get road system, create road #1:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX, height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road2.laneAmount = 4;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
|
|
//Get road system, create road #2:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 2f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road2.laneAmount = 4;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
|
|
//Get road system, create road #3:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 4f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road2.laneAmount = 4;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
|
|
//Get road system, create road #4:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 6f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road2.laneAmount = 4;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
|
|
//Get road system, create road #5:
|
|
nodeLocations.Clear();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(startLocX + (startLocYSep * 8f), height, startLocY + (index * startLocYSep)));
|
|
}
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
road2.laneAmount = 4;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.TrafficLight1, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
|
|
//Now count road intersections, if not 5 throw error
|
|
int intersectionsCount = 0;
|
|
foreach (SplineN node in road1.spline.nodes)
|
|
{
|
|
if (node.isIntersection)
|
|
{
|
|
intersectionsCount += 1;
|
|
}
|
|
}
|
|
if (intersectionsCount != 5)
|
|
{
|
|
Debug.LogError("Unit Test #3 failed: " + intersectionsCount.ToString() + " intersections instead of 5.");
|
|
}
|
|
}
|
|
|
|
|
|
//Large suspension bridge:
|
|
private static void RoadArchitectUnitTest4()
|
|
{
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
for (int index = 0; index < 5; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(3500f, 90f, 200f + (800f * index)));
|
|
}
|
|
|
|
Road testRoad = RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
|
|
//Suspension bridge:
|
|
testRoad.spline.nodes[1].isBridgeStart = true;
|
|
testRoad.spline.nodes[1].isBridgeMatched = true;
|
|
testRoad.spline.nodes[3].isBridgeEnd = true;
|
|
testRoad.spline.nodes[3].isBridgeMatched = true;
|
|
testRoad.spline.nodes[1].bridgeCounterpartNode = testRoad.spline.nodes[3];
|
|
testRoad.spline.nodes[1].LoadWizardObjectsFromLibrary("SuspL-2L", true, true);
|
|
}
|
|
|
|
|
|
//Long road
|
|
private static void RoadArchitectUnitTest5()
|
|
{
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
for (int index = 0; index < 48; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(3000f, 40f, 10f + (79f * index)));
|
|
}
|
|
for (int index = 0; index < 35; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(2900f - (79f * index), 30f, 3960f));
|
|
}
|
|
for (int index = 0; index < 40; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(30, 30f, 3960f - (79f * index)));
|
|
}
|
|
RoadAutomation.CreateRoadProgrammatically(roadSystem, ref nodeLocations);
|
|
}
|
|
|
|
|
|
/// <summary> Very long road </summary>
|
|
public static void RoadArchitectUnitTest6()
|
|
{
|
|
CleanupTest(6);
|
|
|
|
GameObject unitSystem6Object = new GameObject("RoadArchitectSystem6");
|
|
RoadSystem unitSystem6 = unitSystem6Object.AddComponent<RoadSystem>();
|
|
unitSystem6.isAllowingRoadUpdates = false;
|
|
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
for (int index = 0; index < 50; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(6000f, 40f, 10f + (79f * index)));
|
|
}
|
|
for (int index = 0; index < 50; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(5900f - (79f * index), 30f, 5950f));
|
|
}
|
|
for (int index = 0; index < 50; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(-200f, 30f, 5950f - (79f * index)));
|
|
}
|
|
for (int index = 0; index < 50; index++)
|
|
{
|
|
nodeLocations.Add(new Vector3(-200f + (79f * index), 30f, 10f));
|
|
}
|
|
nodeLocations.Add(new Vector3(5995f, 40f, 10f));
|
|
RoadAutomation.CreateRoadProgrammatically(unitSystem6, ref nodeLocations);
|
|
|
|
|
|
//Turn updates back on and update road:
|
|
unitSystem6.isAllowingRoadUpdates = true;
|
|
unitSystem6.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
/// <summary> Create 2L double intersections: </summary>
|
|
public static void RoadArchitectUnitTest7()
|
|
{
|
|
CleanupTest(7);
|
|
|
|
GameObject unitSystem7Object = new GameObject("RoadArchitectSystem7");
|
|
RoadSystem unitSystem7 = unitSystem7Object.AddComponent<RoadSystem>();
|
|
unitSystem7.isAllowingRoadUpdates = false;
|
|
|
|
Road road1;
|
|
Road road2;
|
|
Road road3;
|
|
|
|
//Create base road:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
|
|
nodeLocations.Add(new Vector3(678f, 0.03f, 244f));
|
|
nodeLocations.Add(new Vector3(660f, 0.03f, 347f));
|
|
nodeLocations.Add(new Vector3(639f, 0.03f, 401f));
|
|
//Intersection1
|
|
nodeLocations.Add(new Vector3(577f, 0.03f, 398f));
|
|
//Intersection2
|
|
nodeLocations.Add(new Vector3(406f, 0.03f, 396f));
|
|
nodeLocations.Add(new Vector3(402f, 0.03f, 516f));
|
|
nodeLocations.Add(new Vector3(417f, 0.03f, 626f));
|
|
|
|
road1 = RoadAutomation.CreateRoadProgrammatically(unitSystem7, ref nodeLocations);
|
|
road1.laneAmount = 2;
|
|
|
|
//Get road system, create road #1:
|
|
nodeLocations.Clear();
|
|
|
|
nodeLocations.Add(new Vector3(581f, 0.03f, 237f));
|
|
nodeLocations.Add(new Vector3(580f, 0.03f, 360f));
|
|
//Intersection1
|
|
nodeLocations.Add(new Vector3(577f, 0.03f, 398f));
|
|
nodeLocations.Add(new Vector3(551f, 0.03f, 440f));
|
|
nodeLocations.Add(new Vector3(564f, 0.03f, 485f));
|
|
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(unitSystem7, ref nodeLocations);
|
|
road2.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Get road system, create road #2:
|
|
nodeLocations.Clear();
|
|
nodeLocations.Add(new Vector3(357f, 0.03f, 347f));
|
|
//Intersection2
|
|
nodeLocations.Add(new Vector3(406f, 0.03f, 396f));
|
|
nodeLocations.Add(new Vector3(494f, 0.03f, 450f));
|
|
|
|
road3 = RoadAutomation.CreateRoadProgrammatically(unitSystem7, ref nodeLocations);
|
|
road3.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road1, road3, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Turn updates back on and update road:
|
|
unitSystem7.isAllowingRoadUpdates = true;
|
|
unitSystem7.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
/// <summary> Creates a self closed road; road loop </summary>
|
|
public static void RoadArchitectUnitTest8()
|
|
{
|
|
CleanupTest(8);
|
|
|
|
//Create base road:
|
|
Road road;
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
|
|
nodeLocations.Add(new Vector3(575f, 0.03f, 550f));
|
|
nodeLocations.Add(new Vector3(525f, 0.03f, 600f));
|
|
nodeLocations.Add(new Vector3(575f, 0.03f, 650f));
|
|
nodeLocations.Add(new Vector3(625f, 0.03f, 600f));
|
|
nodeLocations.Add(new Vector3(575f, 0.03f, 550f));
|
|
|
|
GameObject unitSystem8Object = new GameObject("RoadArchitectSystem8");
|
|
RoadSystem unitSystem8 = unitSystem8Object.AddComponent<RoadSystem>();
|
|
unitSystem8.isAllowingRoadUpdates = false;
|
|
road = RoadAutomation.CreateRoadProgrammatically(unitSystem8, ref nodeLocations);
|
|
road.laneAmount = 2;
|
|
|
|
// creates a intersection instead of a road connection
|
|
//UnitTestIntersectionHelper(road1, road1, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
road.spline.ActivateEndNodeConnection(road.spline.nodes[road.spline.nodes.Count - 1], road.spline.nodes[0]);
|
|
|
|
//Turn updates back on and update road:
|
|
unitSystem8.isAllowingRoadUpdates = true;
|
|
unitSystem8.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
/// <summary> Create 3 intersections with end node situations: </summary>
|
|
public static void RoadArchitectUnitTest9()
|
|
{
|
|
CleanupTest(9);
|
|
|
|
GameObject unitSystem9Object = new GameObject("RoadArchitectSystem9");
|
|
RoadSystem unitSystem9 = unitSystem9Object.AddComponent<RoadSystem>();
|
|
unitSystem9.isAllowingRoadUpdates = false;
|
|
|
|
Road road1;
|
|
Road road2;
|
|
Road road3;
|
|
Road road4;
|
|
|
|
//Create base road #1:
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
|
|
nodeLocations.Add(new Vector3(724f, 0.03f, 220f));
|
|
nodeLocations.Add(new Vector3(711f, 0.03f, 345f));
|
|
nodeLocations.Add(new Vector3(686f, 0.03f, 475f));
|
|
nodeLocations.Add(new Vector3(679f, 0.03f, 560f));
|
|
|
|
road1 = RoadAutomation.CreateRoadProgrammatically(unitSystem9, ref nodeLocations);
|
|
road1.laneAmount = 2;
|
|
|
|
//Get road system, create road #2:
|
|
nodeLocations.Clear();
|
|
|
|
nodeLocations.Add(new Vector3(762f, 0.03f, 345f));
|
|
nodeLocations.Add(new Vector3(744f, 0.03f, 345f));
|
|
//Intersection1
|
|
nodeLocations.Add(new Vector3(711f, 0.03f, 345f));
|
|
|
|
road2 = RoadAutomation.CreateRoadProgrammatically(unitSystem9, ref nodeLocations);
|
|
road2.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road1, road2, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Get road system, create road #3:
|
|
nodeLocations.Clear();
|
|
|
|
nodeLocations.Add(new Vector3(615f, 0.03f, 475f));
|
|
nodeLocations.Add(new Vector3(640f, 0.03f, 475f));
|
|
//Intersection2
|
|
nodeLocations.Add(new Vector3(686f, 0.03f, 475f));
|
|
|
|
road3 = RoadAutomation.CreateRoadProgrammatically(unitSystem9, ref nodeLocations);
|
|
road3.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road1, road3, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Get road system, create road #4:
|
|
nodeLocations.Clear();
|
|
nodeLocations.Add(new Vector3(615f, 0.03f, 560f));
|
|
nodeLocations.Add(new Vector3(640f, 0.03f, 560f));
|
|
//Intersection3
|
|
nodeLocations.Add(new Vector3(679f, 0.03f, 560f));
|
|
nodeLocations.Add(new Vector3(725f, 0.03f, 560f));
|
|
|
|
road4 = RoadAutomation.CreateRoadProgrammatically(unitSystem9, ref nodeLocations);
|
|
road4.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road1, road4, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Turn updates back on and update road:
|
|
unitSystem9.isAllowingRoadUpdates = true;
|
|
unitSystem9.UpdateAllRoads();
|
|
}
|
|
|
|
|
|
/// <summary> Creates a self closed road; road loop </summary>
|
|
public static void RoadArchitectUnitTest10()
|
|
{
|
|
CleanupTest(10);
|
|
|
|
//Create base road:
|
|
Road road;
|
|
List<Vector3> nodeLocations = new List<Vector3>();
|
|
|
|
nodeLocations.Add(new Vector3(480f, 0.03f, 178f));
|
|
nodeLocations.Add(new Vector3(412f, 0.03f, 246f));
|
|
nodeLocations.Add(new Vector3(357f, 0.03f, 202f));
|
|
nodeLocations.Add(new Vector3(364f, 0.03f, 140f));
|
|
nodeLocations.Add(new Vector3(418f, 0.03f, 142f));
|
|
nodeLocations.Add(new Vector3(412f, 0.03f, 246f));
|
|
|
|
|
|
GameObject unitSystem10Object = new GameObject("RoadArchitectSystem10");
|
|
RoadSystem unitSystem10 = unitSystem10Object.AddComponent<RoadSystem>();
|
|
unitSystem10.isAllowingRoadUpdates = false;
|
|
road = RoadAutomation.CreateRoadProgrammatically(unitSystem10, ref nodeLocations);
|
|
road.laneAmount = 2;
|
|
UnitTestIntersectionHelper(road, road, RoadIntersection.iStopTypeEnum.None, RoadIntersection.RoadTypeEnum.NoTurnLane);
|
|
|
|
//Turn updates back on and update road:
|
|
unitSystem10.isAllowingRoadUpdates = true;
|
|
unitSystem10.UpdateAllRoads();
|
|
}
|
|
}
|
|
#endif
|
|
}
|