I have a NavMeshSurface component with a baked NavMesh,
and there is an agent in the room.
the ONLY “agent type” in my project is the default Humanoid
my agent’s behavior code works as intended, the agent wanders around the room all according to plan, but the
Console is throwing the following error every frame:
NavMeshBuildSettings for agent type ID: -1 wasn’t found
UnityEngine.AI.NavMesh:Raycast(Vector3, Vector3, NavMeshHit&, Int32)
State_Wander:NavMeshRaycast() (at Assets/05 Scripts/AI/State_Wander.cs:127)
State_Wander:Think() (at Assets/05 Scripts/AI/State_Wander.cs:108)
State_Wander:Think() (at Assets/05 Scripts/AI/State_Wander.cs:103)
State_Wander:Rest() (at Assets/05 Scripts/AI/State_Wander.cs:65)
State_Wander:UpdateStatus() (at Assets/05 Scripts/AI/State_Wander.cs:35)
Behavior_WanderBotLinear:Update() (at Assets/05 Scripts/AI/Behavior_WanderBotLinear.cs:36)
this is the code for my Agent’s Behavior
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class State_Wander : IActStatus_WanderBot {
private readonly Behavior_WanderBotLinear behaviorObj;
public State_Wander (Behavior_WanderBotLinear actorPattern) {
behaviorObj = actorPattern;
}
int currentActionFlag = 0; // 0 = initial, 1 = hasThought, 2 = timeExpired
float restTimer;
float restTime;
int wanderDirectionFlag = 0; //0 = null , 1 = North, 2 = East, 3 = South, 4 = West.
float wanderDistance = 0;
Vector3 originalPos;
Vector3 intendedPos;
Vector3 destinationPos;
#region IActorStatus_Root implementation
public void UpdateStatus()
{
if (behaviorObj.navMeshAgent.remainingDistance <= behaviorObj.navMeshAgent.stoppingDistance) {
if (!behaviorObj.navMeshAgent.hasPath || Mathf.Abs ( behaviorObj.navMeshAgent.velocity.sqrMagnitude) < float.Epsilon) {
currentActionFlag = 0;
}
}
if(currentActionFlag == 0 || currentActionFlag == 1) {
Rest();
}
}
public void GoalAchieved()
{
throw new System.NotImplementedException();
}
public void OnTriggerEnter(Collider other)
{
}
#endregion
#region IActor_WanderBot implementation
public void ToWanderState()
{
throw new System.NotImplementedException();
}
public void ToReactionState()
{
throw new System.NotImplementedException();
}
#endregion
void Rest() {
behaviorObj.navMeshAgent.Stop();
if(currentActionFlag == 0) {
Think();
}
restTimer += Time.deltaTime;
if(restTimer >= restTime) {
restTimer = 0;
currentActionFlag = 2;
Wander();
}
}
void Think() {
currentActionFlag = 1;
restTime = Random.Range(behaviorObj.minRestTime, behaviorObj.maxRestTime);
wanderDirectionFlag = Random.Range(1,5);
wanderDistance = Random.Range(behaviorObj.minWanderDistance, behaviorObj.maxWanderDistance);
originalPos = behaviorObj.theActorGO.transform.position;
switch (wanderDirectionFlag) {
case 1:
intendedPos = new Vector3(originalPos.x, originalPos.y, originalPos.z + wanderDistance);
destinationPos = NavMeshRaycast();
if(destinationPos.z - behaviorObj.theActorGO.transform.position.z <= behaviorObj.minWanderDistance / 2) {
Think();
}
break;
case 2:
intendedPos = new Vector3(originalPos.x + wanderDistance, originalPos.y, originalPos.z);
destinationPos = NavMeshRaycast();
if(destinationPos.x - behaviorObj.theActorGO.transform.position.x <= behaviorObj.minWanderDistance / 2) {
Think();
}
break;
case 3:
intendedPos = new Vector3(originalPos.x, originalPos.y, originalPos.z - wanderDistance);
destinationPos = NavMeshRaycast();
if(behaviorObj.theActorGO.transform.position.z - destinationPos.z <= behaviorObj.minWanderDistance / 2) {
Think();
}
break;
case 4:
intendedPos = new Vector3(originalPos.x - wanderDistance, originalPos.y, originalPos.z);
destinationPos = NavMeshRaycast();
if(behaviorObj.theActorGO.transform.position.x - destinationPos.x <= behaviorObj.minWanderDistance / 2) {
Think();
}
break;
}
// if(NavMesh.FindClosestEdge(behaviorObj.theActorGO.transform.position, out hit, NavMesh.AllAreas)) {
// behaviorObj.theActorGO.transform.LookAt(intendedPos);
}
void Wander() {
behaviorObj.navMeshAgent.SetDestination(destinationPos);
behaviorObj.navMeshAgent.Resume();
}
Vector3 NavMeshRaycast() {
NavMeshHit hit;
bool obstructed;
obstructed = NavMesh.Raycast(behaviorObj.theActorGO.transform.position, intendedPos, out hit, NavMesh.AllAreas);
if(obstructed == true) {
destinationPos = hit.position;
}
else {
destinationPos = intendedPos;
}
return destinationPos;
}
}