[RESOLU] système d'inventaire

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

[RESOLU] système d'inventaire

Message par tenkai188 » 28 Fév 2022 11:32

Bonjour,

je travaille sur un système d'inventaire pour mon jeux mais je rencontre un problème:
J'ai créé 2 SCriptableobject:

1. "Inventory item" pour représenter les objets d'inventaire

Code : Tout sélectionner

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

[CreateAssetMenu(fileName ="New Item", menuName ="Inventory/Items")]
public class InventoryItem : ScriptableObject
{
    public string itemName;
    public string itemDescription;
    public Sprite itemImage;
    public int numberHeld;
    public bool usable;
    public bool unique;
}
2. Player Inventory qui est juste un liste qui contient des inventory Item:

Code : Tout sélectionner

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

[CreateAssetMenu(fileName = "New Inventory", menuName = "Inventory/Player Inventory")]
public class PlayerInventory : ScriptableObject
{
    public List<InventoryItem> myInventory = new List<InventoryItem>();
}
Ensuite j'ai créé le system d'inventaire constitué de 2 scripts:

1. InventorySlot qui sert a faire le lien entre le gameobject dans la scène et les Scriptable object créé grâce au script vu précédemment:

Code : Tout sélectionner

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

public class InventorySlot : MonoBehaviour
{
    [Header("UI Stuff to change")]
    [SerializeField] private TextMeshProUGUI itemNumberText;
    [SerializeField] private Image itemImage;

    [Header("Variable from the item")]
    public InventoryItem thisItem;
    public InventoryManager thisManager;

    public void Setup(InventoryItem newItem, InventoryManager newManager)
    {
        thisItem = newItem;
        thisManager = newManager;
        if(thisItem)
        {
            itemImage.sprite = thisItem.itemImage;
            itemNumberText.text = ""+thisItem.numberHeld;
        }
    }

   
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
2. InventoryManager qui permet d'afficher tout les object de l'inventaire a l'aide d'un prefab (constitué d'une image et d'un texte)

Code : Tout sélectionner

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

public class InventoryManager : MonoBehaviour
{
    [Header("Inventory Information")]
    public PlayerInventory playerInventory;
    [SerializeField] private GameObject blankInventorySlot;
    [SerializeField] private GameObject inventoryPanel;
    [SerializeField] private TextMeshProUGUI descriptionText;
    

    public void setTextAndButton(string description, bool buttonActive)
    {
        descriptionText.text = description;
        if(buttonActive)
        {
            blankInventorySlot.SetActive(true);
        }
        else
        {
            blankInventorySlot.SetActive(true);
        }
    }

    void MakeInventorySlots()
    {
        if(playerInventory)
        {
            for(int i = 0; i < playerInventory.myInventory.Count; i++)
            {
                
                GameObject temp = Instantiate(blankInventorySlot, inventoryPanel.transform.position, Quaternion.identity);
                temp.transform.SetParent(inventoryPanel.transform);
                temp.transform.localScale = new Vector3(1, 1, 1);
                InventorySlot newSlot = temp.GetComponent<InventorySlot>();
                if(newSlot)
                {                    
                    newSlot.Setup(playerInventory.myInventory[i], this);
                }
                
            }
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        MakeInventorySlots();
        setTextAndButton(" ", true);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
Le problème est le suivant:
L'inventaire affiche le bon nombre d'objet (contenu dans le player inventory) mais ceux-ci ne reprennent pas les propriétés (l'image, le nombre, la description, etc...)

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

Re: système d'inventaire

Message par boubouk50 » 28 Fév 2022 13:14

Salut

Code : Tout sélectionner

if(buttonActive)
        {
            blankInventorySlot.SetActive(true);
        }
        else
        {
            blankInventorySlot.SetActive(true);
        }
Parce que le slot blank est toujours actif?
"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

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: système d'inventaire

Message par tenkai188 » 28 Fév 2022 14:23

:rouge: c'est corrigé
Par contre le problème reste le même

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

Re: système d'inventaire

Message par boubouk50 » 28 Fév 2022 16:30

Est ce que le prefab blankInventorySlot possède bien le Component InventorySlot?

Dans la hiérarchie, vois-tu les inventorySlot créés? Si oui, sont-ils visibles? C'est à dire, actifs ou bien initialisés.
Regarde leur component Image et vérifie leur sprite, s'il a été modifié ou non. Ton code me semble correct à première vue, il est donc possible que ce ne soit pas lui le coupable, mais que le RectTransform soit loin, inversé, etc.
"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

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: système d'inventaire

Message par tenkai188 » 28 Fév 2022 17:46

Est ce que le prefab blankInventorySlot possède bien le Component InventorySlot?
Excuse moi, j'ai du mal à comprendre.
Dois-je renommé ou changer l'un des component du prefab ?
Pour l'instant il est constitué d'une image un d'un text:
3.PNG
3.PNG (3.12 Kio) Consulté 1972 fois
Dans la hiérarchie, vois-tu les inventorySlot créés? Si oui, sont-ils visibles? C'est à dire, actifs ou bien initialisés.
Il me semble que oui car lorsque j'ouvre l'inventaire le bon nombre d'inventory slot est créé:
1.PNG
1.PNG (56.78 Kio) Consulté 1972 fois
Mais lorsque je regarde dans ceux-ci, je vois qu'il sont vide comme le prefab par défaut:
2.PNG
2.PNG (18.29 Kio) Consulté 1972 fois

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

Re: système d'inventaire

Message par boubouk50 » 28 Fév 2022 18:54

tenkai188 a écrit :
28 Fév 2022 17:46
Est ce que le prefab blankInventorySlot possède bien le Component InventorySlot?
Excuse moi, j'ai du mal à comprendre.
Pour que ton objet InventorySlot (clone) soit mis à jour, il faut qu'il possède le Component InventorySlot puisque tu essaies d'y accéder. En gros, as-tu ajouté le script InventorySlot sur ton prefab nommé InventorySlot (celui que tu as glissé dans blankInventorySlot)?
"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

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: système d'inventaire

Message par tenkai188 » 28 Fév 2022 19:50

Problème résolu :)
Merci pour ton aide et d'avoir pris le temps de m'expliquer :amen:

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

Re: système d'inventaire

Message par boubouk50 » 01 Mars 2022 10:18

tenkai188 a écrit :
28 Fév 2022 19:50
Problème résolu :)
Merci pour ton aide et d'avoir pris le temps de m'expliquer :amen:
Super :super:

2 choses:
  • Quand une solution est trouvée, il faut l'indiquer aux autres membres en éditant le premier message et ajoutant [RESOLU] au début du titre.
  • Lorsque tu trouves la solution, ce serait bien de nous indiquer laquelle est-elle. Cela nous donne une indication sur les problèmes rencontrés (même si c'est simplement l'oubli d'affectation d'une variable en Inspector)
"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

Répondre

Revenir vers « Scripting »