Page 2 sur 2

Re: pourquoi Unity plante avec ce script C#?

Publié : 24 Avr 2019 16:53
par Kaloverian
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?

Re: pourquoi Unity plante avec ce script C#?

Publié : 24 Avr 2019 18:42
par boubouk50
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.

Re: pourquoi Unity plante avec ce script C#?

Publié : 24 Avr 2019 19:18
par Kaloverian
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 ("-------------------------");
		}
}

	






Re: pourquoi Unity plante avec ce script C#?

Publié : 25 Avr 2019 15:05
par boubouk50

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.