Re: Problèmes de spawn d'un PREFAB
Publié : 27 Nov 2021 16:17
Ton code est étrange, avec probablement des copier-coller hasardeux. Essaie de publier quelque chose de corrigé et de correctement indenté.
Le forum de la communauté francophone d'Unity
http://www.unity3d-france.com/unity/phpBB3/
http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=9&t=18494
En cas de malchance, il peut arriver qu'il n'ait aucune carte.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).
Code : Tout sélectionner
using System.Collections.Generic;
using UnityEngine;
public class RandomLoot : MonoBehaviour
{
[System.Serializable]
public class Drop
{
/* Nommage des identificateurs : peu importe la convention, l'essentiel est de s'y tenir !
* Je connais trois conventions. En gros :
* 1 - Microsoft préconise PascalCasing pour tous les identificateurs, sauf les paramètres.
* 2 - Beaucoup de développeurs mettent les variables et les champs en camelCasing.
* 3 - Unity préfixe les champs par m_, et utilise camelCasing pour les variables.
*
* J'utilise la 2.
*/
public string name;
public GameObject item;
public int dropRarety;
public GameObject spawn;
// Modif : suppression de public Transform spawnPos, non utilisé.
// Quelle différence entre le GameObject item et le GameObject prefab ? Je le met en commentaire.
// A quoi sert spawn ?
// private GameObject prefab;
// Modif : suppression de public GameObject prefabsParent, non utilisé.
// Suppression Start () et Update ().
}
public List<Drop> lootTable = new List<Drop> ();
public int dropChance;
// Tu ne mets pas toutes les chances de ton côté en donnant le même nom à 2 champs différents.
public GameObject spawn;
public int itemWeight;
private void Start ()
{
// Modif : suppression de CalcDropChance, pas utilisée.
// Modif : suppression déclaration d'ItemWeight.
// Calcul de la somme des poids.
itemWeight = 0;
for (int i = 0; i < lootTable.Count; i++)
{
itemWeight += lootTable[i].dropRarety;
}
// Modif : suppression Debug.Log : ItemWeight est dans l'inspecteur.
}
private void Update ()
{
// CalculateLoot n'est pas appelé ? Ajout dans l'Update.
if (Input.GetKeyDown (KeyCode.Space))
{
CalculateLoot ();
}
}
// Modif : capitalisation du nom de la fonction.
public void CalculateLoot ()
{
int randomValue = Random.Range (0, itemWeight);
Debug.Log ($"RandomValue : {randomValue}");
// Modif : tous les champs relatifs aux parents des objets spawnée est supprimé, puisqu'au final tu ne t'en sers pas.
// Modif : tous les champs relatifs aux position et rotation des objets spawnés sont supprimés, tu ne t'en sers pas.
// Je ne comprends pas ce système, mais je suppose qu'il correspond à tes besoins.
// Pourquoi randomValue est décrémentée ?
// Par ailleurs, à quoi sert itemWeight ?
for (int j = 0; j < lootTable.Count; j++)
{
if (randomValue <= lootTable[j].dropRarety)
{
// Modif : ajout du parent (qui sera l'objet portant ce script).
// Modif : suppression de "as GameObject" (à quoi sert-il, puisque les item sont des GameObject).
GameObject go = Instantiate (lootTable[j].item, transform.position, transform.rotation, transform);
// go.transform.SetParent (GameObject.FindGameObjectWithTag ("Test").transform, false); Parentage dans l'instantiate.
// go.SetActive (true); Inutile.
return;
}
randomValue -= lootTable[j].dropRarety;
Debug.Log ("Random Value Decreased " + randomValue);
}
}
}
Code : Tout sélectionner
using System.Collections.Generic;
using UnityEngine;
public class RandomLoot : MonoBehaviour
{
[System.Serializable]
public class Drop
{
public string name;
public GameObject item;
public int dropRarety;
}
public List<Drop> lootTable = new List<Drop> ();
public int itemWeight;
private void Update ()
{
if (Input.GetKeyDown (KeyCode.Space))
{
CalculateLoot ();
}
}
public void CalculateLoot ()
{
int randomValue = Random.Range (0, itemWeight);
for (int j = 0; j < lootTable.Count; j++)
{
if (randomValue <= lootTable[j].dropRarety)
{
Instantiate (lootTable[j].item, transform.position, transform.rotation, transform);
return;
}
randomValue -= lootTable[j].dropRarety;
Debug.Log ("Random Value Decreased " + randomValue);
}
}
}
Si tu dérives la class Drop de MonoBehaviour et Start () et Update () devraient fonctionner je pense.
Code : Tout sélectionner
public class RandomLoot : MonoBehaviour
{
[System.Serializable]
public class Drop : MonoBehaviour
{