pourquoi Unity plante avec ce script C#?

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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 16:53

Si,je peux faire:
code1

Code : Tout sélectionner

void Update () {
		if (Input.GetKeyDown (KeyCode.T)) {
			for (i =1;i<=10; i++) {
				var objeti = new GameObject ("objet" + i);          
				print ("création" + i);
				objet1.transform.Rotate (0,30, 0, Space.Self);}}}


mais pas
code2:

Code : Tout sélectionner

void Update () {
		if (Input.GetKeyDown (KeyCode.T)) {
			for (i =1;i<=10; i++) {
				var objeti = new GameObject ("objet" + i);          
				print ("création" + i);}
				objet1.transform.Rotate (0,30, 0, Space.Self);}}
				
car objet a été déclaré en local
Ni faire:
code3

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class deux_boucles_simples : MonoBehaviour {

	static int i,j;
	

	// Use this for initialization
	void Start () {

		var objet0 = new GameObject ("objet" + 0);

	}

	// Update is called once per frame
	void Update () {
		if (Input.GetKeyDown (KeyCode.T)) {
			for (i =1;i<=10; i++) {
				var objeti = new GameObject ("objet" + i);          
				print ("création" + i);


				for (j=10;j>=5; j--) {
					Destroy (objetj);
					print ("destruction" + j);
				}


			}



			print ("-------------------------");
		}
	}
}

Dans code2,c'est normal que ça ne fonctionne pas objet1.transform.Rotate (0,30, 0, Space.Self); sort de la 1er boucle dans laquelle il a été crée:objet1 n'existe pas dans le contexte local
Dans code3,objet1.transform.Rotate (0,30, 0, Space.Self) ne sort pas de 1ère boucle for puisque la 2ème boucle est contenue dans la 1ère donc cas similaire du code1
Alors ce que je ne comprends pas,c'est que puisque code1 fonctionne pourquoi code3 ne fonctionne pas?

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

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 24 Avr 2019 18:42

aucun des 2 premiers codes ne devraient fonctionner.
objet1 est le nom du gameObject crée, mais le gameObject est contenu dans la variable objeti.
objet1 n'est pas un nom de variable, il est indéfini. Tu devrais donc avoir une erreur console.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 19:18

j'ai amélioré un peu mais les destructions ne sont pas enclenchées à l'appui de Q
Pourquoi?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class list_GameObjects : MonoBehaviour {

	static int i,j;
	List<GameObject> list_objet=new List<GameObject>();
	GameObject objet;



	// Use this for initialization
	void Start () {

		list_objet[0] = new GameObject ("obj0");
		list_objet.Add (objet);



	}

	// Update is called once per frame
	void Update () {
		if (Input.GetKeyDown (KeyCode.T)) {
			for (i = 1; i <= 10; i++) {
				objet = new GameObject ("objet" + i);
				list_objet.Add (objet);
				print ("création" + i);
				print ("nombre d'éléments de la liste à l'appui de T:" + list_objet.Count);
			}
		}
			
		
	  
				
		if (Input.GetKeyDown (KeyCode.Q)){
				for (j=10;j>=5; j--) {
					Destroy(list_objet[j]);
					print ("destruction" + j);
					print ("nombre d'éléments de la liste à l'appui de Q:"+list_objet.Count);
				}


			}



			//print ("-------------------------");
		}
}

	






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

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 25 Avr 2019 15:05

Code : Tout sélectionner

list_objet[0] = new GameObject ("obj0");
		list_objet.Add (objet);
Qu'essaies-tu de faire? Ici tu crées un gameObject nommé obj0 que tu affectes à la liste list_objet en premier (d'ailleurs je ne sais même pas si c'est légal, vu que le premier élément n'existe pas encore...). Ensuite, tu ajoutes un nouvel élément à la liste qui est le gameObject objet.

Code : Tout sélectionner

Destroy(list_objet[j]);
Ici, tu détruis le gameObject de la liste mais tu n'affectes pas la liste, donc l'élément sera toujours présent un contiendra null.

Enfin, à force de faire des Add sans supprimer des éléments ta liste ne fait qu'augmenter alors que toi détruis toujours les mêmes éléments devenus null puisque le gameObject a été détruit.
"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

Répondre

Revenir vers « (C#) CSharp »