我试图想出一种计算方法来比较当前速度与距离下一个航点的距离,最终目标是计算机汽车决定“滑行”、“刹车”或以最佳方式保持油门开启,同时尽可能转向最好的方式,使其不会超过航路点(就像标准 Unity 资产汽车目前在使用航路点 AI 时所做的那样)。但是,我觉得有些事情我没有掌握。我不得不设置大量的障碍物和我称之为“PowerZones”的东西(以百分比形式控制汽车制动量和发动机扭矩的区域)。下面是我目前的课程,当然在航点上是不完整的,但重点是要注意有多少这些区域和障碍物。我真的不觉得应该有这么多!
然而,我有这么多的原因是因为我很难想出一个理想的函数来优化这些作为对手的驾驶和转向决策。这是车辆的驱动和转向功能(其中一些基于现有的 Eyemaginary 教程):
private void Drive()
{
float currDistFromWP = Vector3.Distance(transform.position, nodes[currentNode].position);
float speed = rb.velocity.magnitude;
float timeFloatLeft = currDistFromWP / speed;
Vector3 relativeVector = transform.InverseTransformPoint(nodes[currentNode].position);
float newSteer = (relativeVector.x / relativeVector.magnitude);
Debug.Log("Steer to set: " + newSteer);
Debug.Log("Current distance: " + currDistFromWP);
if ((timeFloatLeft < 1f || Mathf.Abs(newSteer) > .5f) && speed > 5)
{
Debug.Log("Coasting...");
im.throttle = 0;
}
else
{
im.throttle = 1;
}
}
private void ApplySteer()
{
if (avoiding)
return;
Vector3 relativeVector = transform.InverseTransformPoint(nodes[currentNode].position);
float newSteer = (relativeVector.x / relativeVector.magnitude);
im.steer = newSteer;
}
这是我的航点更新功能:
private void CheckWaypointDistance()
{
float currDistFromWP = Vector3.Distance(transform.position, nodes[currentNode].position);
//Debug.Log("Current distance from waypoint: " + currDistFromWP);
if (currDistFromWP < 1.1f)
{
im.brake = false;
if(currentNode == nodes.Count - 1)
{
currentNode = 0;
}
else
{
currentNode++;
}
}
else if (currDistFromWP < 10f)
{
im.brake = true;
}
}
我觉得我可能会比我需要的更难。或者也许我只是需要考虑更多的变量。有没有人有任何提示可以让这在 AI 逻辑方面更加紧凑?如果需要,我很乐意展示更多代码,但想法是让玩家和 AI 都使用 Car Controller 类来驾驶汽车,然后 AI 以玩家需要的方式做出最佳决策在单独的课程中驾驶它。上面的代码是单独的 AI 决策组件。