You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.3 KiB

using EasyRoads3Dv3;
using UnityEngine;
using UnityEngine.Assertions;
namespace ERVertexPath
{
public class ERNetworkVertexPathCreator : MonoBehaviour
{
public bool logEnabled;
public float defaultAngleThreshold = 5f;
public float defaultScanStep = 1f;
public float defaultMaxDistance = 50f;
private bool isInitialized;
private void Awake()
{
Init();
}
public void Init()
{
if (isInitialized)
{
return;
}
Assert.IsNotNull(GetComponent<ERModularBase>(),
"Cant build vertex paths for all roads, ERModularBase not found");
ScanRoadsAndAppendWrapper();
isInitialized = true;
}
private void ScanRoadsAndAppendWrapper()
{
var roads = GetComponentsInChildren<ERModularRoad>();
DebugLog($"Found {roads.Length} roads");
foreach (var road in roads)
{
DebugLog($"Processing road {road.name}");
var wrapper = AppendWrapper(road);
AppendAdapter(road, wrapper);
}
DebugLog($"All roads were extended with vertex path wrappers/adapters");
}
private ERPathToVertexPathWrapper AppendWrapper(ERModularRoad road)
{
var wrapper = road.GetComponent<ERPathToVertexPathWrapper>();
if (!wrapper)
{
wrapper = (ERPathToVertexPathWrapper)road.gameObject.AddComponent(typeof(ERPathToVertexPathWrapper));
wrapper.angleThreshold = defaultAngleThreshold;
wrapper.scanStep = defaultScanStep;
wrapper.maxDistance = defaultMaxDistance;
DebugLog($"Added new wrapper to road {road.name}");
}
else
{
DebugLog($"Found existing wrapper for road {road.name}");
}
InitVertexPathWrapper(road, wrapper);
return wrapper;
}
private void InitVertexPathWrapper(ERModularRoad road, ERPathToVertexPathWrapper wrapper)
{
wrapper.Init(road);
DebugLog($"Wrapper for road {road.name} initialized with {wrapper.Positions.Length} points and {wrapper.TotalDistance} length");
}
private ERPathAdapter AppendAdapter(ERModularRoad road, ERPathToVertexPathWrapper wrapper)
{
var adapter = road.GetComponent<ERPathAdapter>();
if (!adapter)
{
adapter = (ERPathAdapter) road.gameObject.AddComponent(typeof(ERPathAdapter));
adapter.InitFromWrapper(wrapper);
DebugLog($"Added new adapter to road {road.name}");
}
else
{
DebugLog($"Found existing adapter for road {road.name}");
}
adapter.InitFromWrapper(wrapper);
return adapter;
}
private void DebugLog(string message)
{
if (!logEnabled)
{
return;
}
Debug.Log(message);
}
}
}