the goal is to make the drone or the parent Main (Cone) object to patrol around a given target along waypoints using navemsh surface and navemesh agent.
the Main (Cone) the parent object of the drone has attached the patrolling script.
and at the bottom of the hierarchy i added the navmesh surface.
then got this warning/s:
NavMeshAgent is not on the NavMesh.
UnityEngine.Debug:LogWarning (object)
PatrolWithGeneratedWaypoints:Update () (at Assets/My Scripts/PatrolWithGeneratedWaypoints.cs:64)
where line 64 is the debug warning in the Update()
Debug.LogWarning("NavMeshAgent is not on the NavMesh.");
before, when using only the navmesh surface and the script it was working well and the drone was patrolling around fine but then i wanted to change it and make it patrol also on different heights so i changed the patrolling script to use also nameshagent.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PatrolWithGeneratedWaypoints : MonoBehaviour
{
public GenerateWaypoints waypointGenerator;
public float speed = 2.0f;
public float reachDistance = 1.0f;
public Transform spotlight; // Reference to the spotlight
public Transform houseCenter; // Reference to the house center
public float patrolHeight = 5.0f; // Desired patrol height above the ground
private int currentWaypoint = 0;
private NavMeshAgent navMeshAgent;
void Start()
{
navMeshAgent = GetComponent<NavMeshAgent>();
if (navMeshAgent == null)
{
navMeshAgent = gameObject.AddComponent<NavMeshAgent>();
}
navMeshAgent.speed = speed;
navMeshAgent.baseOffset = 0; // Set the base offset to 0 as we manually control the height
}
void Update()
{
if (waypointGenerator.waypoints.Count == 0) return;
// Ensure the NavMeshAgent is on the NavMesh
if (navMeshAgent.isOnNavMesh)
{
navMeshAgent.SetDestination(waypointGenerator.waypoints[currentWaypoint].position);
// Maintain the patrol height
Vector3 newPosition = navMeshAgent.transform.position;
newPosition.y = patrolHeight;
transform.position = newPosition;
float distance = Vector3.Distance(newPosition, waypointGenerator.waypoints[currentWaypoint].position);
if (distance <= reachDistance)
{
currentWaypoint++;
if (currentWaypoint >= waypointGenerator.waypoints.Count)
{
currentWaypoint = 0;
}
}
// Smoothly rotate towards the next waypoint
Vector3 direction = waypointGenerator.waypoints[currentWaypoint].position - transform.position;
Quaternion targetRotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * (speed / reachDistance));
// Smoothly rotate the spotlight to look at the house center
Vector3 lightDirection = houseCenter.position - spotlight.position;
Quaternion lightRotation = Quaternion.LookRotation(lightDirection);
spotlight.rotation = Quaternion.Slerp(spotlight.rotation, lightRotation, Time.deltaTime * speed);
}
else
{
Debug.LogWarning("NavMeshAgent is not on the NavMesh.");
}
}
void OnDrawGizmos()
{
if (waypointGenerator.waypoints.Count > 0)
{
Gizmos.color = Color.blue;
foreach (Transform waypoint in waypointGenerator.waypoints)
{
Gizmos.DrawSphere(waypoint.position, 0.3f);
}
}
}
}
the drone is starting a bit above the ground.
a screenshot of the navmesh surface settings:
and when running the game the navmeshagent settings: