[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

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

Message par Krafter » 20 Fév 2017 20:06

D'aaaaacoooooord!! Je n'avais pas du tout compris que c'était un facteur multiplicateur, ni ne savais que le Plane par défaut était de 10x10! J'ai donc mis une scale de 10 en x et z, problème réglé!

Encore une p'tite question (je m'étale un peu mais je pense que ça rentre dans le sujet du post ^^). Ici on doit instantier les arbres à une hauteur de 1.4f en y et tout se passe bien. Mais je me demande comment cela se passe sur un terrain avec du dénivelé? Peut-être à l'aide d'un script c'est possible de placer des choses aléatoirement sur un terrain accidenté?

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

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

Message par Max » 20 Fév 2017 20:19

Krafter a écrit :Encore une p'tite question (je m'étale un peu mais je pense que ça rentre dans le sujet du post ^^). Ici on doit instantier les arbres à une hauteur de 1.4f en y et tout se passe bien. Mais je me demande comment cela se passe sur un terrain avec du dénivelé? Peut-être à l'aide d'un script c'est possible de placer des choses aléatoirement sur un terrain accidenté?
Si tu utilise le moteur de terrain natif, alors tu as des fonctions qui permettent de déterminer la hauteur du terrain en fonction de ta position (fonction TerrainData.GetHeight et ses copains).
Si tu pars sur un objet autre servant de support, basé sur un mesh, alors cela se complique un peu plus, une des techniques est d'en passer par les raycasts.
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 » 21 Fév 2017 00:45

Merci beaucoup pour tes réponses et ton temps, Max! Je débute donc j'ai pleins de questions naïves. J'essaye de les résoudre, mais en parler en français m'aide à comprendre ce que je fais :)
Je ne sais pas ce qu'est le terrain natif, pour ma part j'ai des dalles de terrain faites sous maya, donc je pense que le raycast sera le plus approprié.
A force de bricolage j'ai un script afin de placer mes arbres sur un support, mais aucuns arbres ne spawn et la console ne me met aucune erreur. J'ai essayé dans diverses scènes, du simple Plane au terrain en relief, même résultat (j'ai mis des lignes en commentaires à force de bidouillages, ne pas en tenir compte ^^") et ces réglages étaient pour un terrain 500x500, sans le raycast je voyais mes arbres apparaitrent (mais à travers le sol).

Voici mon script :

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

            Vector3 position = new Vector3(Random.Range(200, 300), transform.position.y, Random.Range(200, 300));   //cette ligne là

            RaycastHit hit = new RaycastHit();
            if (Physics.Raycast(position, Vector3.down, out hit))
            {
                print("touche");
                GameObject go = (GameObject)Instantiate(arbre, hit.point, Quaternion.identity);
                go.transform.Rotate(new Vector3(0, Random.Range(-15, 15), 0));

                foreach (Transform child in go.transform)
                {
                    child.transform.Rotate(new Vector3(0, Random.Range(-15, 15), 0));

                    couleur = new Color(Random.Range(.0f, .3f), Random.Range(.4f, .8f), Random.Range(.0f, .3f));
                    child.GetComponent<Renderer>().material.color = couleur;
                }
            }
            else
                print("pas touche");



            //GameObject go = (GameObject)Instantiate(arbre, new Vector3(Random.Range(200, 300), transform.position.y, Random.Range(200, 300)), Quaternion.identity);
            //go.transform.Rotate(new Vector3(0, Random.Range(-15, 15), 0));
            //go.transform.localScale = new Vector3(1, 10, 1);

            
        }
	}
	
}

Pour ma part, je pense que l'erreur doit venir de la transform.position.y à la ligne indiquée car c'est le seul paramètre que je ne comprends pas bien? De ce que je vois je choisi un vector3 à une position x et z aléatoire, de ce point je tire un raycast puis là où il touche j'instantie un arbre. Mais je ne dois jamais toucher, j'ai ajouter des prints pour vérifier, résultat dans la console j'ai 100 fois "pas touche". J'ai essayer de mettre une valeur à la place de transform.position.y, j'en ai essayer un paquet même résultat. Donc soit je tire mon raycast du mauvais endroit et c'est en effet ce paramètre que je dois changer, soit je ne m'y prends pas du tout de la bonne façon?

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

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

Message par Max » 21 Fév 2017 12:17

Hello,
Krafter a écrit :Je ne sais pas ce qu'est le terrain natif
il s'agit du moteur de terrain d'Unity.

Sinon, si ton script est placé sur ton terrain, et que tu écris:
Vector3 position = new Vector3(Random.Range(200, 300), transform.position.y, Random.Range(200, 300));
ton rayon pour ton raycast part au niveau de la plateforme elle même, cela ne peut pas aller. Pire, si ton terrain n'est pas un simple plane, ton cast se fera dans le vide dès que ton relief sera positif.
Il faut que la hauteur de départ de ton rayon soit au moins supérieur à la hauteur maximal de ton terrain. Imagine un laser scannant en faisant une passe horizontale au dessus d'une forme 3D....
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 » 21 Fév 2017 12:55

Ah oui donc j'utilise le terrain natif pour m'entrainer, mais ensuite je ne l'utiliserai plus donc autant faire le raycast.

Oui pour l'image du scanner c'est bien ce que je pensais, j'avais essayer de remplacer transform.position.y par des valeurs comme 1.4f, 50, etc.. pour tester et toujours le même résultat. Pourtant mon terrain est pour l'instant un simple plane en 0, 0, 0. (et en 500x500, la zone choisie est dessus en x et z pas de soucis). Ou alors c'est ma nomenclature qui ne va pas je ne peux pas juste mettre une valeur genre "50" à la place de "transform.position.y"? Pourtant mon script ne me met pas d'erreur

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

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

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

Si ton plane est en 0,0,0, avec un scale de 500, qu'il possède bien un collider, que tu calcules tes positions d'arbres par:
Vector3 position = new Vector3(Random.Range(200, 300), transform.position.y+50.0f, Random.Range(200, 300));
alors il n'y a pas de raison que cela ne fonctionne pas. Par contre à savoir qu'en passant par des
Range(200,300), tu n'auras des arbres que sur ... 4% de ta surface, suivant la pos de ta camera, pas sûr que tu les vois.
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 » 21 Fév 2017 23:04

En fait la caméra je l'avais bien positionnée pas de soucis, juste j'écrivais "50" au lieu de "transform.position.y + 50"! Effectivement maintenant je vois mes arbres apparaitrent! Par contre ils ne spawn pas haut, mais à moitié à travers le sol :/ pourtant j'ai fais de nombreux tests allant de 1.4f à 100000000.. ils spawns toujours à la même hauteur à travers le sol :/ Je n'ai pas beaucoup de temps ce soir, j'essaierai de plus regarder demain. Mais merci!

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

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

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

Krafter a écrit : Par contre ils ne spawn pas haut, mais à moitié à travers le sol :/ pourtant j'ai fais de nombreux tests allant de 1.4f à 100000000.. ils spawns toujours à la même hauteur à travers le sol :/ Je n'ai pas beaucoup de temps ce soir, j'essaierai de plus regarder demain. Mais merci!
Cela n'a rien à voir avec tes Raycast, mais en fait le pivot de ton prefab ne doit certainement pas se trouver à la base de ton arbre (comme sur mon dessin de gauche), mais vers le milieu (comme sur mon dessin de droite).
Tu peux éventuellement corriger le soucis en passant par en Empty qui te servira de base/pivot et coller en enfant le reste de ton arbre pour faire un nouveau prefab. Normalement à partir de là cela devrait coller (l'idéal étant peut-être de repasser pas la case modélisation pour modifier au niveau du modèle lui même)

Image
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 » 27 Fév 2017 19:36

Me revoilà ^^
D'accord, donc le pivot ce sera au niveau de l'étape de modélisation qu'il doit être placé au pied de l'objet?

En tout cas merci, ça marche maintenant! Par contre j'ai du faire ça comme un sac, j'ai fais un empty et mis mon arbre en enfant. Puis drag/drop l'empty dans mon projet pour en faire un préfab. Et comme dans mon script je mettais des couleurs aléatoire de feuille avec un foreach child (truc du genre je l'ai pas sous la main là) maintenant c'est l'ensemble de mes arbres qui a une couleur aléatoire, pas seulement les feuilles ^^ je sais pas si y'a un" foreach child de chid"? ^^ (pas trouvé dans la doc' en tout cas!).

En tout cas merci de tes réponses, j'ai enfin mes arbres qui apparaissent ^^ bon encore beaucoup de problèmes à régler mais ils sont bien là, je met en résolu. Merci :)

Répondre

Revenir vers « (C#) CSharp »