J'utilise un script de trajectoire et dans l'*inspector je donne la donnée vitesse
Code : Tout sélectionner
/*
*
* Modifié le 18 / 05 / 2014 par Patrick
* pour retour du VL au départ dès qu'il a fini son path
*
* Modifié le 10 / 04 / 2015
* Pour choix du reprèe de départ et recommencement au 1er repère
*
* Orienter le repere de depart pour eviter le louvoiement dû au fait que
si entre les 2 premiers reperes l'angle est de 90° ( face au Nord)
et que
si l'angle entre les 2 derniers repere est de 30 ° (N.N.E)
ALORS la moto va ressortir au repere 0 avec un angle de 30° et va se redresser pour aller à 90° d'où le louvoiement
DONC il faut orienter le repere de début
Se mettre en coordonnées locales et faire tourner le repere pour que la direction du Y (le bleu) soit celle du path
*
*
* si VL tourne autour d'un repere augmenter "float range = 0.5f,ratio;"
*
* */
/// <summary>
/// Car script. v1.0
/// The script is attached to the vehicle
/// Le script est attaché au véhicule
/// </summary>
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CarScript : MonoBehaviour {
public string nomChemin;
public float vitesseKmh;
float vitesse; // Dooner la vitesse dans **inspector
float sp;
List <Transform> chemin;
float range =100.0f,ratio;// 0.5f::::::::::::::::::::::
Transform _transform,rayPoint;
public int indexDepart; // Placer le vl à cet index manuellement
bool stopCar,emergencyStop,noStopZone;
Rigidbody _rigidbody;
float acceleration;
int layerVehicule = 1 << 8;
void Start(){
_rigidbody = rigidbody;
_rigidbody.centerOfMass += new Vector3(0f, 0f, 1.0f);
vitesse = vitesseKmh/3.6f;
sp = vitesse;
acceleration = 10;
rayPoint = transform.Find ("RaycastPoint");
_transform = transform;
ControlScript sc =GameObject.Find("Controle").GetComponent<ControlScript>();
chemin = new List<Transform> (sc.GetPath(nomChemin));
ratio = 0;
stopCar = emergencyStop=noStopZone = false;
layerVehicule= ~layerVehicule;
}
void Update()
{
RaycastHit hit;
float distance = 5.0f;//:::::::::::5.0f:::::::::::::::::::::::::::
if(!stopCar){
if(vitesse<sp)vitesse+=Time.deltaTime*acceleration;
else if (vitesse > sp)vitesse -=Time.deltaTime*acceleration;
}else if(stopCar){
if(vitesse>0)
vitesse -= Time.deltaTime*acceleration;
else
vitesse=0;
}
if(Physics.Raycast(rayPoint.position,_transform.forward,out hit,distance)){
vitesse = (sp * (hit.distance/distance));
}
Vector3 dir = _transform.position - chemin[indexDepart].position;
if (dir.sqrMagnitude > range)
{
Move(chemin[indexDepart].position);
}
else NextIndex();
}
void Move(Vector3 target)
{
_transform.Translate(0,0,Time.deltaTime*vitesse);
if(ratio<1){
ratio += Time.deltaTime*0.5f;//:::::0.1f:::::::::::::::::::::::
var newRotation = Quaternion.LookRotation(target - _transform.position);
_transform.rotation = Quaternion.Lerp(_transform.rotation,newRotation,ratio);
}
}
void NextIndex()
{
if (++indexDepart >= chemin.Count) {
indexDepart = 0; // 0 est le repere-Debut
transform.position = chemin[indexDepart].position; // cette ligne dit au VL de prendre les coordonnées du repere de depart
transform.rotation = chemin[indexDepart].rotation; // cette ligne dit au VL de prendre l'orientation du repere de depart
}else{
if (++indexDepart == chemin.Count) indexDepart = 0;
ratio = 0;
}
}
public void StopCar(bool b){
if(!noStopZone)
stopCar = b;
}
public void SetSpeed(float f){
sp = f;
}
public float GetSpeed(){
return _rigidbody.velocity.magnitude;
}
public void EmergencyStop(){
if(emergencyStop){
stopCar = true;
acceleration = 20.0f;
StartCoroutine (SetAcceleration());
}
}
IEnumerator SetAcceleration(){
if(vitesse != 0)yield return null;
acceleration = 10.0f;
emergencyStop = false;
}
public void SetEmergencyStop(bool b){
emergencyStop = b;
}
public void SetNoStop(bool b){
noStopZone = b;
}
public void Reset(){
stopCar = false;
noStopZone=false;
emergencyStop= false;
}
}
NullReferenceException: Object reference not set to an instance of an object
SetSpeedScript.OnTriggerEnter (UnityEngine.Collider col) (at Assets/Test_130km-h/_IA_Trajet_2chemins_cam_suit_cible/Script/SetSpeedScript.cs:13)
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class SetSpeedScript : MonoBehaviour {
public float vitesseKmh;
float vitesse;
void Start(){
vitesse = vitesseKmh/3.6f;
}
void OnTriggerEnter(Collider col){
CarScript sc = col.GetComponent<CarScript>();
sc.SetSpeed(vitesse);
}
}
NullReferenceException: Object reference not set to an instance of an object
ArriveScript.OnTriggerEnter (UnityEngine.Collider col) (at Assets/Test_130km-h/_IA_Trajet_2chemins_cam_suit_cible/Script/GiratoireScripts/ArriveScript.cs:26)
Code : Tout sélectionner
/// Le script est attaché à l'objet Arrive sur un giratoire
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ArriveScript : MonoBehaviour {
float speed;
Queue<CarScript> car = new Queue<CarScript>();
public GameObject zone;
CheckZoneScript script;
void Start(){
speed = 10.0f;//5.0f
script= zone.GetComponent<CheckZoneScript>();
}
void OnTriggerEnter(Collider col){
CarScript sc = col.GetComponent<CarScript>();
sc.SetSpeed(speed);
if(!script.FreeZone()) sc.StopCar(true);
car.Enqueue(sc);
}
void OnTriggerExit(){
car.Dequeue();
}
public void ResetCar(){
foreach(CarScript cs in car){
cs.StopCar(false);
}
}
}
Quelqu'un a une idée ?
Merci