我正在 Unity 5 中编写一个 AI 脚本,该脚本主要由协程构成,用于在我的游戏中移动 AI 对象。它实际上工作得很好,并且以这种方式独立于框架。我试图避免混淆Update
类的功能。
但是,我正在尝试创建一个名为wander 的函数,人工智能在其中徘徊并随机选择Vector3
航点区域中的几个s 并前往每个s。之后,人工智能应该去下一个航路点,基本上做同样的事情到无穷远。碰撞检测和所有这些都是为了后面的部分。我想先修复导航部分。
void Start(){
agent = GetComponent<NavMeshAgent> ();
collisionRange = GetComponent<CapsuleCollider> ();
collisionRange.radius = detectionRadius;
if (waypoints.Length > 0) {
StartCoroutine (patrol ());
} else {
StartCoroutine (idle (idleTime));
}
}
IEnumerator patrol(){
agent.SetDestination(waypoints[waypointIndex].position);
Debug.Log ("Patrol started, moving to " + agent.destination);
while (agent.pathPending) {
Debug.Log ("not having path");
yield return null;
}
Debug.Log ("I have a path, distance is " + agent.remainingDistance);
while (float.Epsilon < agent.remainingDistance) {
//Debug.Log ("Moving...");
yield return null;
}
StartCoroutine (nextWaypoint ());
}
IEnumerator idle(int time){
Debug.Log ("Idleing for "+ time + " seconds");
agent.Stop ();
yield return new WaitForSeconds(time);
if(waypoints.Length > 2){
agent.Resume ();
StartCoroutine(patrol());
}
}
IEnumerator wander(){
agent.Stop ();
Debug.Log ("Going to look around here for a while.");
Vector3[] points = new Vector3[wanderPoints];
for (int i = 0; i < wanderPoints; i++) {
agent.Stop ();
Vector3 point = Random.insideUnitSphere * wanderRadius;
point.y = transform.position.y;
points [i] = point;
}
agent.ResetPath ();
agent.SetDestination(points[0]);
agent.Resume ();
Debug.Log ("point: " + points [0]);
Debug.Log ("Destination: " + agent.destination);
while (float.Epsilon < agent.remainingDistance) {
Debug.Log ("Moving...");
yield return null;
}
//StartCoroutine(patrol());
yield return null;
}
IEnumerator nextWaypoint(){
Debug.Log ("Arrived at my waypoint at " + transform.position);
if (waypointIndex < waypoints.Length -1) {
waypointIndex +=1;
} else {
waypointIndex = 0;
}
StartCoroutine(wander ());
yield return null;
}
wander
如果我将函数与idle
in 中的函数交换nextWaypoint
,一切都会按预期工作,但这一点永远不会起作用:
agent.ResetPath ();
agent.SetDestination(points[0]);
agent.Resume ();
Debug.Log ("point: " + points [0]);
Debug.Log ("Destination: " + agent.destination);
这是一些测试代码(手动设置只有 1 个位置point[0]
,但它永远不会到达那个目的地。SetDestination
永远不会更新到我想要设置它们的点。我已经尝试预先计算路径(NavMeshPath)和除了目标路径之外的所有东西都不会奇怪地改变或重置。我while (float.Epsilon < agent.remainingDistance)
在函数中也有循环wander
,但没有运气,因为它会永远留在那个循环中,因为没有路径可以去。
我可能在这里遗漏了一些东西,或者在这种情况下我的逻辑是错误的。希望有人可以给我一点推动或一些额外的调试选项,因为我不知道为什么目的地没有在我的漫游功能中更新。