Проблема с ai гонки

Программирование на Юнити.

Проблема с ai гонки

Сообщение boro 16 фев 2012, 15:12

Всем привет.есть скрипт для ai в гонке.вот сам скрипт

Синтаксис:
Используется javascript
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;
var bsp : float;
var check : GameObject;
//;//bober

var GearRatio : float[];
var CurrentGear : int = 0;
static var dead : boolean = false;


var EngineTorque : float = 600.0;
var MaxEngineRPM : float = 3000.0;
var MinEngineRPM : float = 1000.0;
private var EngineRPM : float = 0.0;

private var waypoints : Array;
private var currentWaypoint : int = 0;
private var bober;
private var b2;
private var temp_position : Vector3;
private var speed2 : float;
static var steer : float;
var centerOfMass : Transform;
var wait_revers : int = 0;
var nazad : boolean = false;
private var RelativeWaypointPosition : Vector3;
private var STime : float = 0; //Vrema

private var inputSteer : float = 0.0;
private var inputTorque : float = 0.0;
private var sn : int = 0;
var waypointContainer: GameObject;

function Start () {

        if(centerOfMass != null)
                rigidbody.centerOfMass = centerOfMass.localPosition;
        GetWaypoints();
}

function Update ()
{
        STime+=Time.deltaTime;
        rigidbody.drag = rigidbody.velocity.magnitude / 250;
       
        NavigateTowardsWaypoint();
       
        EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];//bob abs
        ShiftGears();
        temp_position=transform.position;
        audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
        if ( audio.pitch > 2.0 ) {
                audio.pitch = 2.0;
        }
       
        FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * inputTorque;
        bober=EngineTorque / GearRatio[CurrentGear] * inputTorque;
        FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * inputTorque;
               
        FrontLeftWheel.steerAngle = Mathf.Min(50, 10 * inputSteer);
        FrontRightWheel.steerAngle = Mathf.Max(-50,(Mathf.Min(50,10 * inputSteer)));
        steer=Mathf.Max(-50,(Mathf.Min(50,10 * inputSteer)));
        if (nazad == false){
check.transform.position.x = waypoints[currentWaypoint].position.x;
check.transform.position.z = waypoints[currentWaypoint].position.z;
}
else
{check.transform.position.x = transform.position.x + Mathf.Sin ((transform.eulerAngles.y-180)/57.3)*100;
check.transform.position.z = transform.position.z + Mathf.Cos ((transform.eulerAngles.y-180)/57.3)*100;
};
//Поворот колёс
FrontLeftWheel.transform.rotation = transform.rotation*Quaternion.Euler( 0, steer, 0 );
FrontRightWheel.transform.rotation = transform.rotation*Quaternion.Euler( 0, steer, 0 );
if (dead == true)
        {
        Destroy(gameObject);
        };
}


function  FixedUpdate ()
{//rigidbody.centerOfMass = centerOfMass.localPosition;
speed2=temp_position.z-transform.position.z;
if (speed2<0.001)
        {wait_revers ++;
        if (wait_revers > 35 && nazad == false)
                {
                nazad = true;
                wait_revers=0;
                }
        }
        else
        {
        wait_revers=0;
        }
if (Mathf.Abs(speed2)>0.001) {wait_revers = 0; /*nazad = false;*/};
if (nazad == true) {sn++;};
if (sn > 50) {nazad = false; sn = 0;};
}

function ShiftGears() {
        if ( EngineRPM >= MaxEngineRPM ) {
                var AppropriateGear : int = CurrentGear;
               
                for ( var i = 0; i < GearRatio.length; i ++ ) {
                        if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) {
                                AppropriateGear = i;
                                break;
                        }
                }
               
                CurrentGear = AppropriateGear;
        }
       
        if ( EngineRPM <= MinEngineRPM ) {
                AppropriateGear = CurrentGear;
               
                for ( var j = GearRatio.length-1; j >= 0; j -- ) {
                        if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) {
                                AppropriateGear = j;
                                break;
                        }
                }
               
                CurrentGear = AppropriateGear;
        }
        CurrentGear = 1;
}

function GetWaypoints () {
        //var waypointContainer = GameObject.Find("Waypoints1");
        var potentialWaypoints : Array = waypointContainer.GetComponentsInChildren( Transform );
        waypoints = new Array();
       
        for ( var potentialWaypoint : Transform in potentialWaypoints ) {
                if ( potentialWaypoint != waypointContainer.transform ) {
                        waypoints[ waypoints.length ] = potentialWaypoint;
                }
        }
}

function NavigateTowardsWaypoint ()
{

if (nazad == false)
{
RelativeWaypointPosition = transform.InverseTransformPoint( Vector3(
                                                                                                waypoints[currentWaypoint].position.x,
                                                                                                transform.position.y,
                                                                                                waypoints[currentWaypoint].position.z ) );
//Ручник и пятак
if (speed2<0.05 || RelativeWaypointPosition.z < 0 )
        {
        if (inputSteer < -0.4){transform.eulerAngles.y-=1;};
        if (inputSteer > 0.4) {transform.eulerAngles.y+=1;};
        };
}
else
{RelativeWaypointPosition = transform.InverseTransformPoint( Vector3(
                                                                                                transform.position.x + Mathf.Sin ((transform.eulerAngles.y-180)/57.3)*100,
                                                                                                transform.position.y+1,
                                                                                                transform.position.z + Mathf.Cos ((transform.eulerAngles.y-180)/57.3)*100 ) );
};
//temp_position = RelativeWaypointPosition;
b2=RelativeWaypointPosition.z; 

        inputSteer = RelativeWaypointPosition.x / RelativeWaypointPosition.magnitude;
       
        if ( Mathf.Abs( inputSteer ) < 0.5 && RelativeWaypointPosition.z>0) {
                inputTorque = RelativeWaypointPosition.z / RelativeWaypointPosition.magnitude - Mathf.Abs( inputSteer );
        }else
        {
                //inputTorque = 0;
                if (nazad==true){
                inputTorque = -1;
                inputSteer=-inputSteer;
                };
        }
        if (STime<3)
                {inputTorque = 0;
                nazad = false;
                wait_revers = 0;
                };     
        bsp=RelativeWaypointPosition.magnitude;
        if ( RelativeWaypointPosition.magnitude < 20 ) {
                currentWaypoint ++;
               
                if ( currentWaypoint >= waypoints.length ) {
                        currentWaypoint = 0;
                        STime=-10000;
                       
                }
        }
}


//function OnGUI()
 //   {
//              GUI.Label( new Rect(90,100,180,20), "iSteer: "+inputSteer.ToString("f2"));
//              GUI.Label( new Rect(90,140,180,20), "iTorque: "+inputTorque.ToString("f2"));
//              GUI.Label( new Rect(90,160,180,20), "RWP.mag: "+bsp.ToString("f2"));
//              GUI.Label( new Rect(90,180,180,20), "EngineRPM: "+EngineRPM.ToString("f2"));
//              GUI.Label( new Rect(90,200,180,20), "motorTorque: "+bober.ToString("f2"));
//              GUI.Label( new Rect(90,220,180,20), "RWPosition.z: "+b2.ToString("f2"));
//              GUI.Label( new Rect(90,240,180,20), "speed: "+speed2.ToString("f2"));
//              GUI.Label( new Rect(90,260,180,20), "currentWaypoint: "+currentWaypoint.ToString("f1"));
//      }


по идее машина должна ехать по масиву чекпинтов но почему то едет очень медлено тупо назад.кто может поможете отредактировать или подсказать в чем дело
boro
UNIт
 
Сообщения: 55
Зарегистрирован: 03 окт 2011, 10:57
Откуда: Киев

Re: Проблема с ai гонки

Сообщение Левш@ 16 фев 2012, 19:35

почему то едет очень медлено тупо назад

Куда направили, туда и едет.
Смените курс на противоположный и разумееться добавьте скорость.
В скрипте вашем лень разбираться, если честно мура какаято перенавороченная...(ИМХО).
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Проблема с ai гонки

Сообщение Nolex 24 фев 2012, 16:33

Эт скрипт из урока CarTutorial(не с офф. сайта, а др. автора на блоге который висит) + еще видимо ТС допилил что-то.. и вот в этих допиливаниях он ошибся..

Откати скрипт до оригинала, там все работает. Я и сам на базе этого AI себе сделал AI для ховера.
А то что едет не в ту сторону, то вейпоинты, наверное, криво поставил.
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14