mirror of
https://github.com/DerTyp7/traffic-unity.git
synced 2025-10-30 21:27:07 +01:00
99 lines
2.6 KiB
C#
99 lines
2.6 KiB
C#
using UnityEngine;
|
|
|
|
public class TrafficParticipant : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private TrafficNode nextNode;
|
|
|
|
[SerializeField]
|
|
private TrafficNode currentNode;
|
|
|
|
private bool onNodeNetwork = false;
|
|
|
|
|
|
private float speed = 1f;
|
|
|
|
private void Update()
|
|
{
|
|
if (currentNode)
|
|
{
|
|
speed = currentNode.GetSpeed();
|
|
|
|
if (onNodeNetwork)
|
|
{
|
|
if (nextNode != null)
|
|
{
|
|
transform.position = Vector3.MoveTowards(transform.position, nextNode.transform.position, speed * Time.deltaTime);
|
|
if (transform.position == nextNode.transform.position)
|
|
{
|
|
Arrived();
|
|
ChooseNextNode();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ChooseNextNode();
|
|
}
|
|
}
|
|
else // Align to node network
|
|
{
|
|
transform.position = Vector3.MoveTowards(transform.position, currentNode.transform.position, speed * Time.deltaTime);
|
|
if (transform.position == currentNode.transform.position)
|
|
{
|
|
onNodeNetwork = true;
|
|
ChooseNextNode();
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
currentNode = GetNearestNode();
|
|
}
|
|
|
|
}
|
|
|
|
private TrafficNode GetNearestNode()
|
|
{
|
|
GameObject[] allTrafficNodes = GameObject.FindGameObjectsWithTag("TrafficNode");
|
|
|
|
if (allTrafficNodes.Length > 0)
|
|
{
|
|
GameObject nearestNodeObject = allTrafficNodes[0];
|
|
|
|
foreach (GameObject nodeObject in GameObject.FindGameObjectsWithTag("TrafficNode"))
|
|
{
|
|
if ((transform.position - nodeObject.transform.position).sqrMagnitude < (transform.position - nearestNodeObject.transform.position).sqrMagnitude)
|
|
{
|
|
nearestNodeObject = nodeObject;
|
|
}
|
|
}
|
|
return nearestNodeObject.GetComponent<TrafficNode>();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void Arrived()
|
|
{
|
|
currentNode = nextNode;
|
|
nextNode = null;
|
|
}
|
|
|
|
private void ChooseNextNode()
|
|
{
|
|
if (nextNode == null)
|
|
{
|
|
nextNode = currentNode.GetNextTrafficNodes()[Random.Range(0, (currentNode.GetNextTrafficNodes().Count))];
|
|
}
|
|
}
|
|
|
|
private void OnDrawGizmos()
|
|
{
|
|
if (nextNode != null)
|
|
{
|
|
Gizmos.color = Color.red;
|
|
Gizmos.DrawLine(transform.position, nextNode.transform.position);
|
|
}
|
|
}
|
|
}
|