pourquoi Unity plante avec ce script C#?

Modérateurs : Administrateurs Suppléants, Community Manager

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

pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 02:44

bonjour,

Pourquoi Unity plante après avoir importé ce script C#?:

Code : Tout sélectionner

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


public class deux_boucles_simples : MonoBehaviour {

	static int i;
	

	// 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 (i =10;i>=5; i--) {
					Destroy (objeti);
					print ("destruction" + i);
				}


			}



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

merci de votre aide

Avatar de l’utilisateur
DevAmat
Messages : 232
Inscription : 23 Nov 2016 11:50

Re: pourquoi Unity plante avec ce script C#?

Message par DevAmat » 24 Avr 2019 09:28

"Unity plante"
C'est à dire?

Kaloverian
Messages : 58
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 12:21

j'appuie sur play,le premier objet est crée puis rien ne se passe quand j'appuie sur la touche T
Enfin,impossible d'arrêter le play pour recommencer.
Rien n'est signalé dans la console.
Est-ce le fait que sur ce script,mon pc n'est pas assez puissant pour faire tourner Unity?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5061
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 24 Avr 2019 13:34

tu imbriques deux boucles mais tu utilises le même incrément i pour les 2, du coup la boucle devient infinie car i ne devient jamais supérieure à 10.
Utilises un autre incrément dans ta deuxième boucle: i par j, par exemple.
"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

Kaloverian
Messages : 58
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 14:18

oui mais si je fais:

Code : Tout sélectionner

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


public class deux_boucles_simples : MonoBehaviour {

	static int i;
	

	// 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 ("-------------------------");
		}
	}
}

l'objet i devient objet j dans la 2ème boucle alors que objet j n'est pas déclaré !
Comment puis-je procéder?Je n'y arrive pas

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5061
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 24 Avr 2019 15:00

:roll:
Les mots m'en tombent, et mes bras me manquent...

Il faut différencier plusieurs choses:
- Ce que tu veux faire
- Ce que tu crois faire
- Ce que tu fais

En l'occurrence, je ne me suis pas occupé des deux premiers et ai répondu à ta question.
Maintenant, ton script n'a pas vraiment d"utilité tel quel. Et il vaudrait mieux donc s'occuper de ce que tu veux faire. Parce que ton code, actuellement, crée 10 gameObjects et les détruit (en fait il détruit 5 fois le nouveau gameObject créé) à chaque appui sur la touche T.
Ce code n'a aucun sens et est très mal codé. Donc éclaire-moi sur ce que tu veux faire uniquement, parce que ça n'a aucun sens de te corriger.
"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

Kaloverian
Messages : 58
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 15:05

oui ça n'a aucun sens parce que c'est juste un test.
Après si ce test fonctionne(ce qui n'est pas le cas!),j'applique cette imbrication de boucles for à un tir dupliqué(script élaboré qui fonctionne) dans lequel chaque appui de la touche génère dynamiquement 2 objets de trajectoire symétrique et où le générant doit aussi être détruit

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5061
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 24 Avr 2019 15:13

donc juste faire une imbrication de boucle??
La sainte doc : https://docs.microsoft.com/fr-fr/dotnet ... ywords/for

Code : Tout sélectionner

for (int i=0 ; i<10 ; i++) {
//code
	for (int j=10 ; j>5 ; j++) {
	//code
	}
}
Au delà de la boucle, les variables ont des noms qui les définissent, tu ne peux pas changer un numéro dans une variable pour accéder "à la suivante", il te faut utiliser un tableau.
"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

Kaloverian
Messages : 58
Inscription : 10 Août 2016 03:03

Re: pourquoi Unity plante avec ce script C#?

Message par Kaloverian » 24 Avr 2019 16:04

"tu ne peux pas changer un numéro dans une variable pour accéder "à la suivante", il te faut utiliser un tableau"
Mais alors pourquoi ce code fonctionne?

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

Là je peux accéder à n'importe quelle variable objeti
par exemple

Code : Tout sélectionner

objeti.transform.Rotate (0,30, 0, Space.Self);

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5061
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: pourquoi Unity plante avec ce script C#?

Message par boubouk50 » 24 Avr 2019 16:30

objeti est une seule et unique variable. Tu ne fais que l'affecter en boucle. Tu ne gardes que le dernier gameObject créé.
tu ne peux pas écrire non plus, objet0, objet1, objet2, etc.
"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 »