-1

度々質問してすみません。Andrew Gotow の Car AI に問題があります。問題は、AI が前のプレイヤー/車を避けなかったか、前に進んで前のプレイヤー/車にぶつかったことです。車や障害物にぶつかると、加速を停止したり、動作を停止したりします。

私を助けてください。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
}

}

4

1 に答える 1

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);
}

既存のロジックを使用して、優先する軌道を選択できます。それは世界で最も洗練されたものではありませんが、出発点になるでしょう:

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();
}

わかりやすくするために、疑似コードと Java を少し混ぜました。これはあなたの問題を解決するように見えますか?

于 2013-02-24T14:19:24.867 に答える