[Résolu] [DB-AL] Instancier un GameObject aléatoire?
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
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
[Résolu] [DB-AL] Instancier un GameObject aléatoire?
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!
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.
Re: [DB-AL] Instancié un GameObject aléatoire?
Bonsoir,
peux tu poster ton script (dans les balises code), plutôt qu'un lien vers une image. Merci.
peux tu poster ton script (dans les balises code), plutôt qu'un lien vers une image. Merci.
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
Re: [DB-AL] Instancié un GameObject aléatoire?
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 () {
}
}
Re: [DB-AL] Instancier un GameObject aléatoire?
Ben là c'est pareil, tu passes trois paramètres:Krafter a écrit :Pouvez-vous m'aider? J'avais déjà utiliser instantiate avec 3 paramètres, là ce sont des paramètres random
- '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.
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, ..., ...);'.Krafter a écrit :surtout je ne comprends pas la nomenclature qui précède la fonction : GameObject go = (GameObject)
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
Re: [DB-AL] Instancier un GameObject aléatoire?
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
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
Re: [DB-AL] Instancier un GameObject aléatoire?
oui pour rester simple.Krafter a écrit :Ok, donc (GameObject)Instantiate signifie que l'on veut que la fonction retourne un GameObject si je comprends bien.
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).Krafter a écrit :Et pourquoi go? Juste un nom qu'on donne ça pourrait être "tarte aux fruit" ça serait pareil?
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à.
ta syntaxe est légèrement incomplète.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
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);
}
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);
}
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);
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
Re: [DB-AL] Instancier un GameObject aléatoire?
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 :
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 :
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 ^^")
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));
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);
Re: [DB-AL] Instancier un GameObject aléatoire?
Ben après là c'est une question de logique.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 ^^")
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.
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
Re: [DB-AL] Instancier un GameObject aléatoire?
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 ^^"
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 ^^"
Re: [DB-AL] Instancier un GameObject aléatoire?
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).
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