Unity3d 统一-汽车AI避障

Unity3d 统一-汽车AI避障,unity3d,artificial-intelligence,unityscript,raycasting,racing,Unity3d,Artificial Intelligence,Unityscript,Raycasting,Racing,对不起,问得太多了。我对Andrew Gotow的车有问题。问题是,AI没有避开他们前面的玩家/汽车,或者他们只是继续前进并击中他们前面的玩家/汽车。当撞到汽车或任何障碍物时,它们会停止加速或停止工作。 请帮帮我。我想不出如何让人工智能不会碰到障碍物 这是我使用的代码。谢谢你的帮助 function GotNewWaypoint(newWay : Vector3, newRot : Quaternion){ wpObj.transform.position = newWay; w

对不起,问得太多了。我对Andrew Gotow的车有问题。问题是,AI没有避开他们前面的玩家/汽车,或者他们只是继续前进并击中他们前面的玩家/汽车。当撞到汽车或任何障碍物时,它们会停止加速或停止工作。

请帮帮我。我想不出如何让人工智能不会碰到障碍物

这是我使用的代码。谢谢你的帮助

function GotNewWaypoint(newWay : Vector3, newRot : Quaternion){
    wpObj.transform.position = newWay;
    wpObj.transform.rotation = newRot;// wpObj is a triggered box collider that sets GotNewWaypoint function everytime AI hits the collider
}

function NavigateTowardsWaypoint(){ // Runs in Update function
var relativePosition : Vector3;
var hit : RaycastHit;

if(!alternativeWaypointer){
    relativePosition = transform.InverseTransformPoint(Vector3(wpObj.transform.position.x,transform.position.y,wpObj.transform.position.z));
}else{// turn on alternative position if Spherecast hits object
    relativePosition = transform.InverseTransformPoint(Vector3(raycaster*wpObj.transform.position.x,transform.position.y,wpObj.transform.position.z)); // move wpObj on axis x a bit so the AI shouldn't hit the obstacle
}

if(Physics.SphereCast(transform.position,40,transform.forward,hit,30)){
    if(hit.transform != this.transform){
        if(hit.collider.tag == "Player" || hit.collider.tag == "Opponent" || hit.collider.tag == "Environtment"){
            alternativeWaypointer = true;
            raycaster = -Vector3.Normalize(hit.point).x * 5;
        }else alternativeWaypointer = false;
    }
}

inputSteer = relativePosition.x / relativePosition.magnitude;//used for ai's handling control. usually it's 1 or -1

if(Mathf.Abs(inputSteer) < .5){
    inputTorque = relativePosition.z / relativePosition.magnitude; //corner is not too tight, accelerate
}else{
    inputTorque = 0.0; // corner is too tight, stop accelerating
}
函数GotNewWaypoint(newWay:Vector3,newRot:Quaternion){
wpObj.transform.position=newWay;
wpObj.transform.rotation=newRot;//wpObj是一个触发的长方体碰撞器,每次AI点击碰撞器时,它都会设置GotNewWaypoint函数
}
函数NavigateTowardsWaypoint(){//在更新函数中运行
var相对位置:矢量3;
var-hit:RaycastHit;
如果(!alternativeWaypointer){
relativePosition=transform.InverseTransformPoint(向量3(wObj.transform.position.x,transform.position.y,wObj.transform.position.z));
}否则{//如果Spherecast命中对象,则启用“替换位置”
relativePosition=transform.InverseTransformPoint(Vector3(光线投射器*wpObj.transform.position.x,transform.position.y,wpObj.transform.position.z));//在x轴上稍微移动wpObj,这样AI就不会撞到障碍物
}
如果(物理,球击(变换位置,40,变换向前,命中,30)){
if(hit.transform!=此.transform){
如果(hit.collider.tag==“玩家”| | hit.collider.tag==“对手”| | hit.collider.tag==“环境”){
alternativeWaypointer=true;
raycaster=-Vector3.Normalize(hit.point).x*5;
}else alternativeWaypointer=false;
}
}
inputSteer=relativePosition.x/relativePosition.magnitude;//用于ai的处理控制。通常为1或-1
如果(主Abs(输入转向)<.5){
inputTorque=relativePosition.z/relativePosition.magnitude;//转角不太紧,加速
}否则{
inputTorque=0.0;//转角太紧,停止加速
}

}

据我所知,您的AI有一个测试,看看它是否会与某些东西发生碰撞。此测试的结果似乎分配给变量
alternativeWaypointer
,允许使用以下if语句:

if(!alternativeWaypointer){
    relativePosition = computePosition(trajectory);
}else{
    relativePosition = computePosition(adjustTrajectory(trajectory));
}
您的调整轨迹逻辑可能不起作用。也许这是可以检验的?与此相反,一个可能的问题是调整后的轨迹没有充分调整以避免碰撞。我们可以通过创建一系列假设的轨迹,然后选择最佳候选来解决这个问题

alternativeWaypointer = isCollisionLikely(trajectory);

if(!alternativeWaypointer) {
    relativePosition = computePosition(trajectory);
} else {
    /* generate alternative trajectories, adjustments range from minimal to extreme */
    List<Trajectory> alternatives = adjustTrajectoryList(trajectory, MINIMAL, EXTREME);

    /* Of these, pick one and run with it */
    Trajectory preferred = leastLikelyCollisionTrajectory(alternatives);
    relativePosition = computePosition(preferred);
}
alternativeWaypointer=isCollisionLikely(轨迹);
如果(!alternativeWaypointer){
相对位置=计算位置(轨迹);
}否则{
/*生成替代轨迹,调整范围从最小到极端*/
列表备选方案=调整轨迹列表(轨迹、最小值、极限值);
/*在这些中,选择一个并用它运行*/
首选轨迹=最小的协同(备选);
相对位置=计算位置(首选);
}
您可以使用现有逻辑来选择首选轨迹。这将不是世界上最复杂的事情,但它将是一个起点:

Trajectory leastLikelyCollistionTrajectory(List<Trajectory> options) {

    /* iterate from minimal adjustment to extreme */
    foreach(Trajectory t in options) {
        if(!isCollisionLikely(t)) {
            return t; /* return the first trajectory that seems ok */
        }
    }

    /* otherwise resort to the most extreme and hope */
    return options.last();
}
轨迹最小相似控件(列表选项){
/*从最小调整迭代到极限*/
foreach(选项中的轨迹t){
如果(!isCollisionLikely(t)){
返回t;/*返回第一条看起来正常的轨迹*/
}
}
/*否则诉诸于最极端和希望*/
返回选项。last();
}

为了让它更清晰,我将伪代码与一些java混合在一起。这看起来能解决您的问题吗?

很难一目了然地理解您的代码。你能给它加些注释吗?想必,在某个地方,如果碰撞的概率达到某个阈值,您正试图通过调整航向来预测碰撞。这在你的代码中的什么地方?@deau我已经添加了注释。此代码附加在AI汽车的根目录中。每次SphereCast碰到某个东西时,我都会尝试在x轴(wpObj)上稍微移动航路点,这样AI就不会碰到它们前面的任何障碍物。但不管怎样,他们只是碰到了前面的障碍物。但有时它是有效的,人工智能并没有相互碰撞(如果障碍物在他们身边的话),我想我解决了它。如果ai碰到任何障碍物,我将输入扭矩设置为零,因此如果ai看到前面或侧面有障碍物,就会刹车。谢谢你的回答