Scripts demandent donnée mais celle-ci est déjà donnée

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Scripts demandent donnée mais celle-ci est déjà donnée

Message par freepl » 14 Avr 2015 10:08

Bonjour

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






Pour ma maquette j'ai 2 autres scripts en erreur qui me demandent la donnée Vitesse du 1 er script alors que je l'ai donnée


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

et pour l'autre script même erreur ?!
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);
		}
	}
}

on me dmande la vitesse alors que je l'ai donnée.
Quelqu'un a une idée ?

Merci

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par boubouk50 » 14 Avr 2015 10:28

Es-tu sur que c'est bien vitesse qui est en cause? Et pas sc qui n'a pas réussi à récupérer le Component CarScript? As-tu bien tout renseigné dans l'Inspector?
Il serait utile pour éviter ce genre de désagrément de gérer les exceptions et les erreurs possibles. Par ex:

Code : Tout sélectionner

void OnTriggerEnter(Collider col){
      CarScript sc = col.GetComponent<CarScript>();
      if (sc != null)
          sc.SetSpeed(vitesse);
      else
          Debug.Log("Le collider ne possède pas de Component CarScript");
}
Il est possible que tu entres en collision avec d'autres objets que ceux qui possèdent le Component CarScript.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

sotec
Messages : 542
Inscription : 21 Sep 2012 10:11

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par sotec » 14 Avr 2015 10:56

ta vitesse est un float, un float est non nullable, ton erreur ne vient pas de là

EDIT : un coup de debugger et tu trouvera quel objet est null
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par freepl » 14 Avr 2015 11:36

j'ai rempli les vitesses dans les Inspector et pour les collider je n'ai que le terrain et rein d'autre.
Mais ce qui me gene le plus c'est que aléatoirement, le Vl arrive au bout du trajet et réapparait directement au 1er repère et d'autre fois on voit le VL aller du dernier au permier repèr en traversant toute la scène.
Le script de carscript est bon mais pourquoi de temps en temps cela buggue?

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par freepl » 14 Avr 2015 11:46

sotec a écrit :ta vitesse est un float, un float est non nullable, ton erreur ne vient pas de là

EDIT : un coup de debugger et tu trouvera quel objet est null

comment je fais pour le coup de debugger ?

Avatar de l’utilisateur
axel
Messages : 1924
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par axel » 14 Avr 2015 11:50

sotec a écrit :EDIT : un coup de debugger et tu trouvera quel objet est null
J'ai ma petite idée là dessus...

sotec
Messages : 542
Inscription : 21 Sep 2012 10:11

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par sotec » 14 Avr 2015 11:52

hmmf ...
place les point d'arret dans tes initialisations, avance pas à pas (f10) après avoir lancer le debugger (le petit triangle vert dans mono)
et regarde ce qu'il y a dans tes variables au fur et à mesure

si tu n'y arrive pas, trouve un tuto car le debugger, c'est la base pour corriger des erreurs d'execution (je ne vois même pas comment tu peux faire sans )
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Scripts demandent donnée mais celle-ci est déjà donnée

Message par freepl » 14 Avr 2015 11:53

j'ai vu mon pote google mais je n'ai que ceci
http://translate.google.fr/translate?hl ... rev=search
et ce n'est pas trop détaillé

Je n'ai jamais utilise le debugger
J'arrive ici mais après ...
Image

Répondre

Revenir vers « (C#) CSharp »