Problèmes de spawn d'un PREFAB

Questions à propos du GUI, y compris la partie script.
Unitigre
Messages : 8
Inscription : 16 Nov 2021 17:27

Problèmes de spawn d'un PREFAB

Message par Unitigre » 19 Nov 2021 15:13

Bonjour tout le monde,

Je développe un jeu avec un système qui drop une carte à chaque ouverture de booster. Le script qui régie le "random loot" fonctionne, je peux le confirmer via la console et la hiérarchie. Mes cartes sont des prefabs.

Mon problème : la carte tirée ne s'affiche pas dans la fenêtre du jeu.

Dans la hiérarchie, je peux voir qu'un clone du prefab d'une carte tirée via le script spawn correctement, mais aucune trace de ladite carte dans le jeux. J'ai réussi à la faire spawn dans le canva pour voir si cela changeais quelques chose mais rien n'y fais.

ci-dessous les images unity :
Image
Image
Image
Comme vous pouvez le voir sur cette dernière capture d'écran, le prefab est bien apparu dans la hiérarchie, mais pas dans la scène.

Comment faire pour faire apparaître mes prefab dans ma scène ?

merci de votre aide.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Problèmes de spawn d'un PREFAB

Message par jmhoubre » 20 Nov 2021 01:12

Pas d'images chez moi et comme j'ai cassé ma boule de cristal...
Avec le script ce serait pas mal.

Unitigre
Messages : 8
Inscription : 16 Nov 2021 17:27

Re: Problèmes de spawn d'un PREFAB

Message par Unitigre » 20 Nov 2021 16:36

jmhoubre a écrit :
20 Nov 2021 01:12
Pas d'images chez moi
My bad... j'ai un réseau assez pourris en ce moment

Image
Image
Image
Comme vous pouvez le voir sur cette dernière capture d'écran, le prefab est bien apparu dans la hiérarchie, mais pas dans la scène.

Le code en entier :

Code : Tout sélectionner

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

public class RandomLoot : MonoBehaviour
{
    [System.Serializable]
    public class Drop
    {
        public string name;
        public GameObject item;
        public int DropRarety; 
        public GameObject Spawn;
        public Transform spawnPos;
    }
    public List <Drop> LootTable = new List<Drop>();
    public int DropChance; 
    public GameObject Spawn;
    public Transform spawnPos;

    public void calculateLoot()
    {
        int CalcDropChance = Random.Range(0,101);
        int ItemWeight = 0;
        for(int i = 0; i <LootTable.Count; i++)
        {
            ItemWeight += LootTable[i].DropRarety;
        }
        Debug.Log("ItemWeight = " + ItemWeight);

        int RandomValue = Random.Range(0, ItemWeight);

        for(int j = 0; j <LootTable.Count; j++)
        {
            if(RandomValue <= LootTable[j].DropRarety)
            {
                GameObject newitem = Instantiate(LootTable[j].item, transform.position, transform.rotation) as GameObject;
                newitem.transform.SetParent(GameObject.FindGameObjectWithTag("Test").transform, false);
                newitem.SetActive(true);
                return;
            }
            RandomValue -= LootTable[j].DropRarety; 
            Debug.Log("Random Value Decreased " + RandomValue);
        }
    }
}
Merci beaucoup de bien vouloir m'aider.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Problèmes de spawn d'un PREFAB

Message par jmhoubre » 20 Nov 2021 19:55

C'est mieux, mais il manque une vue de l'inspecteur de la carte spawnée, et une vue de l'inspecteur du LootManager.

Je n'ai rien remarqué pour l'instant dans le code.

Quelques questions et remarques :
- quels sont les objets taggués "Test " ? Si comme je le suppose, il n'y en a qu'un, ce serait bien de mettre en cache cet objet, au lieu de le chercher à chaque spawn (ligne newitem.transform.SetParent (GameObject.FindGameObjectWithTag ("Test").transform, false);)
- itemWeight ne pourrait-il pas être calculé dans une fonction Start () ?
- dans certains cas, il n'y a pas de loot. C'est le comportement attendu ?

Unitigre
Messages : 8
Inscription : 16 Nov 2021 17:27

Re: Problèmes de spawn d'un PREFAB

Message par Unitigre » 20 Nov 2021 22:31

jmhoubre a écrit :
20 Nov 2021 19:55
il manque une vue de l'inspecteur de la carte spawnée, et une vue de l'inspecteur du LootManager.
Carte spawnée :
Image

LootManager :
Image
jmhoubre a écrit :
20 Nov 2021 19:55
ce serait bien de mettre en cache cet objet, au lieu de le chercher à chaque spawn
Voici l'object :
Image
Tu me conseille de le désactiver? Cela ne risque pas de masquer aussi la carte spawnée ?
jmhoubre a écrit :
20 Nov 2021 19:55
- itemWeight ne pourrait-il pas être calculé dans une fonction Start () ?
Voici le nouveau code :

Code : Tout sélectionner

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

public class RandomLoot : MonoBehaviour
{
    [System.Serializable]
    public class Drop
    {
        public string name;
        public GameObject item;
        public int DropRarety; 
        public GameObject Spawn;
        public Transform spawnPos;
    }
    public List <Drop> LootTable = new List<Drop>();
    public int DropChance; 
    public GameObject Spawn;
    public Transform spawnPos;
    public int ItemWeight;

    void Start()
    {
        int CalcDropChance = Random.Range(0,101);
        int ItemWeight = 0;
        for(int i = 0; i <LootTable.Count; i++)
        {
            ItemWeight += LootTable[i].DropRarety;
        }
        Debug.Log("ItemWeight = " + ItemWeight);
    }
    public void calculateLoot()
    {

        int RandomValue = Random.Range(0, ItemWeight);

        for(int j = 0; j <LootTable.Count; j++)
        {
            if(RandomValue <= LootTable[j].DropRarety)
            {
                GameObject newitem = Instantiate(LootTable[j].item, transform.position, transform.rotation) as GameObject;
                newitem.transform.SetParent(GameObject.FindGameObjectWithTag("Test").transform, false);
                newitem.SetActive(true);
                return;
            }
            RandomValue -= LootTable[j].DropRarety; 
            Debug.Log("Random Value Decreased " + RandomValue);
        }
    }
}
jmhoubre a écrit :
20 Nov 2021 19:55
- dans certains cas, il n'y a pas de loot. C'est le comportement attendu ?
Oui, à terme j'aimerais que le joueur puisse réaliser 7 tirages, pour avoir idéalement 7 nouvelles cartes. Sauf dans des cas de malchance ou il n'en aura que 6 (c'est peut-être une mauvaise idée mais ce n'est pas bien grave).

Merci encore pour tes réponses.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Problèmes de spawn d'un PREFAB

Message par jmhoubre » 21 Nov 2021 11:21

Mettre en cache un objet, c'est le stocker dans une variable, et appeler cette variable plutôt que chercher de nouveau cet objet, notamment quand la recherche de cet objet est coûteuse.

Code : Tout sélectionner

	[SerializableField] private prefab;
	private GameObject prefabsParent;
	
	private void Start ()
	{
		prefabsParent= GameObject.Find("Bidule");
		if (prefabsParent== null { Debug.LogError("Flute, pas de bidule...");
	}
	
	private void Update ()
	{
		Instantiate(prefab, prefabsParent.transform);
	}

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Problèmes de spawn d'un PREFAB

Message par jmhoubre » 21 Nov 2021 11:31

UR 1 (Clone) a, me semble-t-il, des coordonnées élevées. Lance le jeu, met en pause, sélectionne ta carte et focus dessus (F avec le curseur de la souris au-dessus de la fenêtre scene). Est-elle visible ?

Si je suis bien le parcours, la carte est instanciée dans le script RandomLoot, attaché à l'objet LootManager :

Code : Tout sélectionner

GameObject newitem = Instantiate(LootTable[j].item, transform.position, transform.rotation) as GameObject;
La carte est donc aux coordonnées de LootManager, enfant de Spawn et de Canvas. Bien vérifier ces coordonnées, et le paramétrage de ton Canvas. Ce serait sans doute prudent de simplifier ceci en déplaçant le script dans Canvas.

Unitigre
Messages : 8
Inscription : 16 Nov 2021 17:27

Re: Problèmes de spawn d'un PREFAB

Message par Unitigre » 21 Nov 2021 18:14

J'ai bien mit en cache l'objet, voici le code sans erreur sur Unity :

Code : Tout sélectionner

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

public class RandomLoot : MonoBehaviour
{
    [System.Serializable]
    public class Drop
    {
        public string name;
        public GameObject item;
        public int DropRarety; 
        public GameObject Spawn;
        public Transform spawnPos;
        private GameObject prefab; 
	    public GameObject prefabsParent;
	    private void Update ()
	    {
		    Instantiate(prefab, prefabsParent.transform);
	    }
        private void Start()
        {
            prefabsParent= GameObject.Find("Bidule");
		if (prefabsParent== null) 
        { Debug.LogError("Flute, pas de bidule...");}
        }
    }
    public List <Drop> LootTable = new List<Drop>();
    public int DropChance; 
    public GameObject Spawn;
    public Transform spawnPos;
    public int ItemWeight;

    void Start()
    {
        
        int CalcDropChance = Random.Range(0,101);
        int ItemWeight = 0;
        for(int i = 0; i <LootTable.Count; i++)
        {
            ItemWeight += LootTable[i].DropRarety;
        }
        Debug.Log("ItemWeight = " + ItemWeight);
    }
    public void calculateLoot()
    {

        int RandomValue = Random.Range(0, ItemWeight);

        for(int j = 0; j <LootTable.Count; j++)
        {
            if(RandomValue <= LootTable[j].DropRarety)
            {
                GameObject newitem = Instantiate(LootTable[j].item, transform.position, transform.rotation) as GameObject;
                newitem.transform.SetParent(GameObject.FindGameObjectWithTag("Test").transform, false);
                newitem.SetActive(true);
                return;
            }
            RandomValue -= LootTable[j].DropRarety; 
            Debug.Log("Random Value Decreased " + RandomValue);
        }
    }
}
Je vois effectivement la carte mais très éloignée de son spawn. Je me demande aussi si ma composition est normale ou si mes paramètres sont éclatés.

Image
Image

Enfin, j'ai bien déplacé le script dans le canvas mais j'ai peur d'avoir fais une mauvaise manip car depuis je n'ai plus aucun spawn même dans la hiérarchie.
Image

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Problèmes de spawn d'un PREFAB

Message par jmhoubre » 21 Nov 2021 18:38

Sans erreur ? Avec 2 fonctions Start et 2 fonctions Update ?

Unitigre
Messages : 8
Inscription : 16 Nov 2021 17:27

Re: Problèmes de spawn d'un PREFAB

Message par Unitigre » 22 Nov 2021 12:08

jmhoubre a écrit :
21 Nov 2021 18:38
Sans erreur ? Avec 2 fonctions Start et 2 fonctions Update ?
J'ai aucune notif d'erreur de Visual Studio ou d'Unity. J'ai d'ailleurs du mettre la private start() dans le [System.Serializable] pour qu'ils me laissent tranquille.
Le seul changement est l'absence de spawn quand je clique le bouton.

Je dois manquer quelque chose non ?

Répondre

Revenir vers « L'interface GUI »