HATEBIN
>
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class CarAIManager : MonoBehaviour { [SerializeField] public float carSpeed = 5f; [SerializeField] public float safeDistance = 2f; public GameObject currentTrafficRoute; // Set of waypoints gameobject along a road public GameObject nextTrafficRoute; // The next set of waypoints the car goes to when crossing a signal [SerializeField] public int currentWaypointNumber; NavMeshAgent carNavMeshAgent; void Start() { carNavMeshAgent = this.gameObject.GetComponent
(); carNavMeshAgent.speed = carSpeed; } // Update is called once per frame void Update() { RaycastHit hit; Physics.Raycast(transform.position, transform.right, out hit, safeDistance); if(hit.transform) { if(hit.transform.tag == "Car") StopCar(); if(hit.transform.tag == "Waypoint") MoveCar(); } else { MoveCar(); } } void StopCar() { carNavMeshAgent.speed = 0; } void MoveCar() { if(nextTrafficRoute == null) carNavMeshAgent.speed = 0; else carNavMeshAgent.speed = carSpeed; if(currentWaypointNumber < (currentTrafficRoute.transform.childCount - 1)) // keeps moving the car forward by assigning destination as next successive waypoint { if(carNavMeshAgent.speed == 0) carNavMeshAgent.speed = carSpeed; carNavMeshAgent.SetDestination(currentTrafficRoute.transform.GetChild(currentWaypointNumber + 1).transform.position); // Sets the successive waypoint as the car NavMesh destination float distance = Vector3.Distance(transform.position, currentTrafficRoute.transform.GetChild(currentWaypointNumber + 1).transform.position); // finds distance between car's current location and next waypoint if(distance <= 100) { currentWaypointNumber += 1; // updates the waypoint number in the same traffic route } } else if(currentWaypointNumber == currentTrafficRoute.transform.childCount - 1) // when the car reaches the last waypoint it needs to change track { if(carNavMeshAgent.speed == 0) carNavMeshAgent.speed = carSpeed; if(nextTrafficRoute != null) // unless car reaches the end of the line { carNavMeshAgent.SetDestination(nextTrafficRoute.transform.position); float distance = Vector3.Distance(transform.position, nextTrafficRoute.transform.position); // distance between car's current location and position of the next waypoint if(distance <= 1) { currentWaypointNumber = 0; // start of next waypoint of next traffic route (new road after signal crossing) currentTrafficRoute = nextTrafficRoute.transform.parent.gameObject; // updates current traffic route } } } } }