[Résolu] [DB-AL] Instancier un GameObject aléatoire?

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
Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

[Résolu] [DB-AL] Instancier un GameObject aléatoire?

Message par Krafter » 18 Fév 2017 21:05

Bonjour,

Je post car j'ai un petit soucis de code que je n'arrive pas à résoudre. Je me suis procuré un livre conseillé sur ce forum pour apprendre avec Unity 5, je commence les tutos bon je ne comprends pas tout mais j'y arrive.
J'en suis à la partie où je dois instancié des arbres de manière procédurale. On doit créer un tronc avec un cube 3D, puis des cubes 3D en haut pour faire les feuilles. On met des couleurs, on a donc notre prefab prêt à être utilisé pour générer une forêt d'arbres uniques.

Cependant il y a une fonction qui est indiquée dans le livre mais que je n'arrive pas à utiliser. J'ai essayer divers trucs (rajouter des as GameObject un peu partout sans comprendre ce que je faisais, tester des trucs trouvés dans la doc unity un peu au hasard, des choses du genre ^^) mais pas moyen, Visual Studio n'est pas content de cette ligne.

Pouvez-vous m'aider? J'avais déjà utiliser instantiate avec 3 paramètres, là ce sont des paramètres random mais surtout je ne comprends pas la nomenclature qui précède la fonction : GameObject go = (GameObject)

Voici mon script comme demandé dans le tuto, je ne vois pas où j'ai fais une bêtise :/ (notez que je suis au début de cette section, je n'ai pas encore mis le code pour faire varier la rotation des feuilles, etc..)

http://puu.sh/u94Zo/7cd631dca1.png

Merci!
Dernière édition par Krafter le 27 Fév 2017 19:41, édité 3 fois.

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Instancié un GameObject aléatoire?

Message par Max » 18 Fév 2017 21:10

Bonsoir,

peux tu poster ton script (dans les balises code), plutôt qu'un lien vers une image. Merci.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Instancié un GameObject aléatoire?

Message par Krafter » 18 Fév 2017 21:20

Ah pardon, j'avais fais une image de mon code, je n'avais pas vu ces balises, j'espère que j'ai mis les bonnes

Code : Tout sélectionner

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

public class Generation : MonoBehaviour {

    public GameObject arbre;
    private Color couleur;
    public int nbArbres = 100;


	// Use this for initialization
	void Start ()
    {
        for (int i = 0; i < nbArbres; i++)
            //générer la forêt ici
            GameObject go = (GameObject)Instantiate(arbre, new Vector3(Random.Range(0, 100), 1.4f, Random.Range(0, 100)), Quaternion.identity);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}




Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Max » 18 Fév 2017 21:45

Krafter a écrit :Pouvez-vous m'aider? J'avais déjà utiliser instantiate avec 3 paramètres, là ce sont des paramètres random
Ben là c'est pareil, tu passes trois paramètres:
- 'arbre', qui est le prefab à instancier,
- la position, un Vector3, dont tu fournis effectivement 2 paramètres aléatoirement (x et z), et une valeur fixe y.
- la rotation.
Krafter a écrit :surtout je ne comprends pas la nomenclature qui précède la fonction : GameObject go = (GameObject)
Il faut spécifier le type d'Object attendu lors de ton Instantiation (Instantiate est une méthode d'Object, qui renvoi donc un type Object, ou dérivés). Dans ton cas, tu cherches à instancier un GameObject (arbre), donc il faut spécifier le type d'object attendu en retour (pour l'affecter à go) et donc faire une conversion (un cast). De la même manière, on pourrait écrire par exemple un truc du genre 'Rigidbody rb = (Rigidbody) Instantiate(unrigidbody, ..., ...);'.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Krafter » 18 Fév 2017 22:39

Ok, donc (GameObject)Instantiate signifie que l'on veut que la fonction retourne un GameObject si je comprends bien.
Et pourquoi go? Juste un nom qu'on donne ça pourrait être "tarte aux fruit" ça serait pareil?

Mais pourquoi cela ne marche pas? J'ai eu un message "Embedded statement cannot be a declaration or a labeled statement" à propos de cette ligne de code :/

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Max » 18 Fév 2017 23:22

Krafter a écrit :Ok, donc (GameObject)Instantiate signifie que l'on veut que la fonction retourne un GameObject si je comprends bien.
oui pour rester simple.
Krafter a écrit :Et pourquoi go? Juste un nom qu'on donne ça pourrait être "tarte aux fruit" ça serait pareil?
Oui. C'est arbitraire, même si on essais toujours de donner des noms qui se veulent parlant un minimum, pour s'y retrouver dans son code, c'est même codifié normalement, si on voulait être tatillon (mais bon, là encore, on va rester simple).
Dans ce cas c'est la contraction de GameObject, en minuscule. On est vraiment dans les bases de la programmation, avec la définition des variables, leurs noms, leurs type, etc... Il faut vraiment bosser ces trucs là.
Krafter a écrit :Mais pourquoi cela ne marche pas? J'ai eu un message "Embedded statement cannot be a declaration or a labeled statement" à propos de cette ligne de code :/
ta syntaxe est légèrement incomplète.
Si tu écris par exemple:

Code : Tout sélectionner

		for (int i = 0; i < nbArbres; i++) {
			GameObject go = (GameObject) Instantiate (arbre, new Vector3 (Random.Range (0, 100), 1.4f, Random.Range (0, 100)), Quaternion.identity);
		}
cela devrait marcher,
ou bien encore (plus académique, même si aujourd'hui lors du passage en IL les compilo corrigent d'eux même ce genre de chose, mais on s'égare):

Code : Tout sélectionner

		GameObject go;
		for (int i = 0; i < nbArbres; i++) {
			go = (GameObject) Instantiate (arbre, new Vector3 (Random.Range (0, 100), 1.4f, Random.Range (0, 100)), Quaternion.identity);
		}
Après, dans ton cas 'go' ne semble pas avoir de réelle utilité (après je ne connais pas ce que fourni le livre que tu as et si tu as posté le code complet) et il faut éviter de définir des variables qui ne sont jamais employées. Donc tu peux je pense simplement écrire:

Code : Tout sélectionner

		for (int i = 0; i < nbArbres; i++)
			 Instantiate (arbre, new Vector3 (Random.Range (0, 100), 1.4f, Random.Range (0, 100)), Quaternion.identity);
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Krafter » 19 Fév 2017 17:50

Ah c'était tout simplement ça! Au moins maintenant je comprends la fonction :)

go je l'ai réutiliser en avançant dans la leçon, par exemple :

Code : Tout sélectionner

go.transform.Rotate(new Vector3(0, Random.Range(-15, 15), 0));
d'où je pense l'intérêt de la déclarer.

Bon quand je génère mes arbres ils explosent sur ma scène car plusieurs doivent spawn au même endroit j'imagine, je vais me pencher dessus.
Par contre dans le livre on a donc un "Plane" qu'il fallait faire 50x50 (j'ai mis 50 pour x et z dans "Scale" je ne sais pas si c'est la bonne façon?). Dans le code de génération des arbres on prend une range de 0 à 100 pour les positions en x et z :

Code : Tout sélectionner

GameObject go = (GameObject)Instantiate(arbre, new Vector3(Random.Range(0, 100), 1.4f, Random.Range(0, 100)), Quaternion.identity);
Dans le livre les arbres recouvrent tout le "Plane", moi ils sont tous sur un petit carré au centre :/ Peut être ma façon de régler le Plane avec le scale qui est mauvaise? (J'espère que mes questions justifient un post, ça me semble bête mais je coince sur la compréhension de ce que je fais et je trouve peu de choses sur internet qui l'explique en français ^^")

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Max » 19 Fév 2017 18:10

Krafter a écrit :Dans le livre les arbres recouvrent tout le "Plane", moi ils sont tous sur un petit carré au centre :/ Peut être ma façon de régler le Plane avec le scale qui est mauvaise? (J'espère que mes questions justifient un post, ça me semble bête mais je coince sur la compréhension de ce que je fais et je trouve peu de choses sur internet qui l'explique en français ^^")
Ben après là c'est une question de logique.
Tu va créer des arbres qui seront placés sur des coordonnées allant de 0 à 100 (x/z). Il parait logique de ce fait, que ton plane fasse déjà une largeur de 100 au moins. En suite, sa position doit couvrir cette plage, de 0 à 100 (en coordonnée absolu). Tu créés un plane, scale x/z de 100, et à la position de 50, 0, 50 (la position du transform étant prise en compte sur le centre du plane, il faut donc le décaler). Si tu laisse ton plane à 0,0,0, tu verra vite que seul un quart de la surface sera concerné.
En faisant divers essais, tu pigera vite le truc.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Krafter » 19 Fév 2017 18:41

Justement c'est là que je ne comprends pas la logique.. Dans le tuto son plane fait 50x50 (mais il ne montre pas comment il l'a régler, si c'est scale ou pas) et il utilise le code que j'ai mis, avec des range allant de 0 à 100. Et les arbres recouvrent bien tout son plane.

J'ai fais de même, mais voici ce que j'obtiens. Mon plane étant en position 50, 0, 50 (bon quand je modifie ça les arbres ne spawn pas au même endroit sur mon plane j'ai bien compris) et scale 50, 0, 50.

http://puu.sh/uamja/52437c50fc.png

Sachant que les quelques arbres autour c'est qu'ils se gênent entre eux lors de la génération et se poussent. Alors j'ai réussi à bien avoir une forêt qui recouvre mon Plane, mais en prenant des ranges pour x et z de -250 à 250 et en positionnant mon Plane en 0,0,0!
C'est pour ça je ne comprends pas bien la logique. J'ai l'impression que le fait d'avoir choisi des scales x et z de 50 pour le plane engendre un facteur 5 entre l'unité du plan (le 50, 0, 50) et les unités des ranges (comme pour couvrir mon 50*50 je fais des ranges de -250 à 250). Donc je trouve ça étrange ^^"

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Instancier un GameObject aléatoire?

Message par Max » 19 Fév 2017 18:53

Il est évident que tout dépend du plane utilisé. Par exemple si c'est le Plane par défaut d'Unity, si tu veux une zone de 100x100, dans ce cas il faut lui appliquer un scale de 10. Donc il faut bien évidemment ajuster la taille en fonction de l'object 3D que l'on utilise comme support, et de sa taille de base (le scale ne définissant pas la taille d'un objet, mais un facteur multiplicateur ou diviseur par rapport à sa taille initiale).
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »