[RESOLU]Récupérer un élément précis d'une liste

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

[RESOLU]Récupérer un élément précis d'une liste

Message par Choiny » 26 Avr 2022 02:50

Bonjour,

J'ai 2 script que l'on va appeler A et B ,
J'aimerais récupérer et stocker dans une List de mon script A un élément précis (un scriptable Object) se trouvant dans une List sur mon script B

Actuellement je récupère la List complète alors que moi j'aimerais récupérer un seul type d'objet notamment par son "Id" ou par son "Name"
Voici mon scriptable object:

Code : Tout sélectionner

public class Item : ScriptableObject
{
    public int id;
    public string itemName;
    public string description;
    public int price;
    public int bronzePrice;
    public int silverPrice;
    public int goldPrice;
    public Sprite image;
    public int HpGiven;
    public int speedGiven;
    public float speedDuration;

}
Mon script A:

Code : Tout sélectionner

public class ClickOnMe : MonoBehaviour
{

    public GameObject StakingUI;
    public string pnjName;
    public Item[] itemsToStake;
   
    public WalletInventory walletInventory;

    void Start()
    {
        itemsToStake = walletInventory.GetList(); 
    }
    
    private void OnMouseDown()
    {
        StakingPump.instance.OpenStakingPump(itemsToStake, pnjName);
    }


}
et mon script B:

Code : Tout sélectionner

public class WalletInventory : MonoBehaviour
{

    public Item[] Inventory;



    public static WalletInventory instance;

    private void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("il y a plus d'une instance de WalletInventory dans la scene");
            return;

        }
        instance = this;
    }
    public Item[] GetList()
    {

            return Inventory;
    }
}
EDIT: Je viens de me rendre compte que j'ai confondu Array et List...
je pense que la liste est plus adapter a mon utilisation car des objet devrons être ajouter et retirer de ces liste pendant l'exécution du jeu, qu'en pensez vous?


j'ai essayer de trouver directement sur internet mais je suis débutant et après des heures de recherches et d'essais je me tourne vers vous pour m'aider a avancer, merci d'avance pour votre temps
Dernière édition par Choiny le 29 Avr 2022 05:02, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Récupérer un élément précis d'une liste

Message par boubouk50 » 26 Avr 2022 09:12

Utiliser des listes lorsque le nombre d'éléments est variable est souvent plus judicieux et plus simple à mettre en place, notamment pour ajouter ou retirer des éléments, et éviter d'avoir des emplacements libres. Mais ce n'est pas non plus obligatoire.
Pour ce qui est de récupérer un seul élément par son id ou son nom, il te suffit simplement de définir une fonction qui le fait.

Code : Tout sélectionner

public Item GetItemByID (int _id)
{
	// Définir l'item à renvoyer et l'initialiser
	Item item = null;
	// Boucler sur tous les éléments de la liste
	// Ici j'ai défini Inventory comme une liste, sinon .Count devient .Length pour une array
	for (int i=0; i<Inventory.Count; i++)
	{
		// Comparer les ids
		if (Inventory[i].id == _id)
		{
			// Récupérer l'item
			item = Inventory[i];
			// Arrêter la boucle
			break;
		}
	}
	// Renvoyer l'item trouvé sinon renvoyer null (valeur de item par défaut) 
	return item;
}
Pour le nom, c'est pareil, il faut juste comparer 2 string au lieu des int.
Il est possible de faire plus rapide avec Linq, mais au moins ici tu as une version de comment faire une recherche dans une liste.

Attention toutefois, dans ton code tu récupères le tableau d'Item au Start () ce qui te donnera le contenu de ce tableau à cet instant t, mais s'il vient à changer, il te faudra le récupérer de nouveau.
En récupérant, juste la donnée concernée, ce problème n'existera plus, je tenais simplement à te le signaler.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

Re: Récupérer un élément précis d'une liste

Message par Choiny » 26 Avr 2022 15:03

ok merci, je crois que je commence a comprendre , par contre a quel moment je precise mon ID (dans le script A?)

Code : Tout sélectionner

    void Start()
    {
        itemsToStake = walletInventory.GetItemByID(?????); 
    }
l'ID que je recherche est 230

et dans mon script B je doit indiqué 230 sur cette ligne?

Code : Tout sélectionner

            if (inventory[i].id == _id)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Récupérer un élément précis d'une liste

Message par boubouk50 » 26 Avr 2022 16:34

C'est l'inverse.

Tu renseignes les paramètres de la fonction pour qu'elle sache avec quelle valeur travailler.

Code : Tout sélectionner

walletInventory.GetItemByID(230);
te renverra l'item ayant pour ID 230. L'idée de passer par une fonction est de pouvoir la faire fonctionner avec n'importe quel ID. Sinon, il serait plus simple d'avoir une variable dans la classe B qui contient la valeur de l'élément 230 et d'aller la chercher au besoin. Mais tu serais limité à cet unique ID, ce qui est très restreint.

Quand tu définis une fonction, ses paramètres n'ont pas de valeurs affectées. Elle définit des opérations génériques. En faisant appel à elle, cela permet de donner des valeurs aux paramètres et donc de définir ces opérations.

Code : Tout sélectionner

public Item GetItemByID (int _id)
{
_id prendra la valeur que tu lui auras passé en paramètre, et le calcul de la fonction sera fait avec cette valeur.
walletInventory.GetItemByID (21); renvoie l'item 21 s'il existe, null sinon.
walletInventory.GetItemByID (10); renvoie l'item 10 s'il existe, null sinon.
etc

Si tu définis l'ID dans la fonction alors tu seras limité à celui-ci.

Code : Tout sélectionner

public Item GetItemByID ()
{
	Item item = null;
	for (int i=0; i<Inventory.Count; i++)
	{
		if (Inventory[i].id == 230)
		{
			item = Inventory[i];
			break;
		}
	}
	return item;
}
Ici, la fonction ne renverra QUE l'item 230 s'il existe, null sinon.

Pourquoi se contenter de l'ID 230 uniquement quand on peut le faire avec tous?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

Re: Récupérer un élément précis d'une liste

Message par Choiny » 26 Avr 2022 16:42

Effectivement c'est mieux comme tu le dit, car je pourrais le réutilisé pour rechercher d'autre ID

Cela me met une erreur si je met 230

Image

Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

Re: Récupérer un élément précis d'une liste

Message par Choiny » 26 Avr 2022 16:55

si j'enleve itemToStake devant j'ai plus d'erreur sur VScode par contre sur unity cela ne marche pas

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Récupérer un élément précis d'une liste

Message par boubouk50 » 26 Avr 2022 18:20

le message est explicite:
La fonction renvoie un Item et tu essaies de l'affecter à une liste d'Item.
Donc:
Soit tu changes le type de itemToStake pour qu'il soit un Item (à la base c'est ce que tu avais demandé il me semble, de récupérer un item et pas une liste)
Soit tu laisses itemToStake comme une liste et tu ajoutes l'Item à cette liste, dans ce cas, tu dois passer par Add ().

Code : Tout sélectionner

itemToStake.Add(walletInventory.GetItemByID(230));
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

Re: Récupérer un élément précis d'une liste

Message par Choiny » 26 Avr 2022 18:54

okkkkkk, merci tu est Genial!!!

par contre je remarque que si j'ai 2 item avec l id 230 il récupère 1 seul item :(

je doit faire utiliser une coroutine pour recommencer la manip de sort a récupérer tt les éléments 230 de ma list?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Récupérer un élément précis d'une liste

Message par boubouk50 » 27 Avr 2022 09:27

Choiny a écrit :
26 Avr 2022 18:54
par contre je remarque que si j'ai 2 item avec l id 230 il récupère 1 seul item :(
La demande initiale ne parlait pas de ça.
J'aimerais récupérer et stocker dans une List de mon script A un élément précis (un scriptable Object) se trouvant dans une List sur mon script B
Dans ce cas, tu ne peux pas récupérer un seul élément mais bien une liste ou un tableau d'éléments. Si tu fais plusieurs appels à la fonction, tu auras tjs le même résultat: le premier élément trouvé avec l'ID 230.

Posons donc les bases:
Tu veux récupérer tous les éléments avec un ID spécifique.
  • Il te faut l'ID en entrée -> Paramètres
  • Il te faut un tableau ou une liste en sortie -> Retour

Code : Tout sélectionner

public List<Item> GetItemByID (int _id) //Valeur de retour: List<Item>. Valeur d'entrée: int _id
{
	// Définir la liste d'item à renvoyer et l'initialiser
	List<Item> items = new LIst<Item> ();
	// Boucler sur tous les éléments de la liste
	// Ici j'ai défini Inventory comme une liste, sinon .Count devient .Length pour une array
	for (int i=0; i<Inventory.Count; i++)
	{
		// Comparer les ids
		if (Inventory[i].id == _id)
		{
			// ajouter l'item à la liste
			items.Add (Inventory[i]);
		}
	}
	// Renvoyer la liste d'items trouvés
	// Cette liste peut être vide, avec un seul ou plusieurs éléments
	return items;
}
J'ai simplement modifié la valeur de retour (puisque ce n'est plus un seul item, mais plusieurs) et enlever la condition d'arrêt de la boucle pour pouvoir traiter tous les éléments de la liste Inventory.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Choiny
Messages : 22
Inscription : 15 Mars 2022 21:45

Re: Récupérer un élément précis d'une liste

Message par Choiny » 27 Avr 2022 22:56

Parfait c'est exactement ça, sa va bien me débloquer, merci beaucoup!!!, si par la suite je veut rechercher plusieurs ID diffèrent , je doit refaire la manip pour chaque ID ou je peut le mettre en paramètre?

edit j'ai bidouiller un truc lol, j'ai rajouter un int type dans mon scriptable Item et j'ai mis le même numéro a mon groupe d'objet

Répondre

Revenir vers « Scripting »