Utilice Json para realizar el almacenamiento de datos del sistema de mochila (dos)

1. Preparación de arte (sé un hacha)

Haz un hacha en la licuadora como objeto para ser recogido.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Ponlo aquí y descubre que el color de la textura ha cambiado ligeramente. Estoy usando URP aquí. No sé el motivo. Me gustaría pedirles un consejo a todos. Gracias por la solución.

Dos, los datos de Json están conectados con la interfaz GUI

Cada vez que comemos el hacha, necesitamos poner los datos del hacha en la mochila (lista de la clase de mochila),
por lo que necesitamos un ItemOnWorld, que es la interacción entre los objetos del mundo y los datos de la mochila.

public class ItemOnWorld : MonoBehaviour
{
    
    
    [Header("物体所属的背包")]
    public BagManager Bag;

    private Item item=new Item();
    [Header("物体属性")]
    public string name;
    public int number;
    public string des;
    public string type;
    public string spritePath;


    private void Awake()//将属性赋予物体
    {
    
    
        item.name = name;
        item.number = number;
        item.des = des;
        item.type = type;
        item.spritePath = spritePath;
    }

    private void OnCollisionEnter(Collision collision)
    {
    
    
        if (collision.gameObject.CompareTag("Player"))
        {
    
    
            AddNewItem();
            Destroy(this.gameObject);
        }
    }

    private void AddNewItem()
    {
    
    

        foreach (var m_item in Bag.Mydata.bagData)//检测有没有同名物体,没有就添加
        {
    
    
            if (m_item.name==item.name)
            {
    
    
                m_item.number += 1;
                Debug.Log("物体:" + item.name + ",的数量:" + m_item.number);
                return;
            }

        }
        Bag.Mydata.bagData.Add(item);
        Debug.Log("加入物体");
    }
}

Cuelgue esto en el objeto, complete los parámetros y luego pruebe, copie 5 ejes y luego verifique si los datos se agregaron correctamente a los datos de la mochila La
Inserte la descripción de la imagen aquí
prueba es exitosa
Inserte la descripción de la imagen aquí

En tercer lugar, vincule los datos con la interfaz de la mochila.

, Creamos un script BagGuiManager para administrar la interfaz GUI, todo lo que tenemos que hacer es usar este script para crear las imágenes correspondientes basadas en los datos de la mochila.
Escriba un método RefreshItem para actualizar la mochila (regenerar objetos según los datos de la mochila)
CreatGUIItem asigna la ranura de acuerdo con el elemento entrante (la implementación específica de generar GUI basada en los datos del elemento en la mochila)

using UnityEngine;
using UnityEngine.UI;

public class BagGuiManager : MonoBehaviour
{
    
    
    public static BagGuiManager instacne;

    private void Awake()
    {
    
    
        if (instacne != null)
        {
    
    
            Destroy(this);
        }
        instacne = this;
    }

    [Header("背包")]
    public BagManager bag;

    public Slot slot;//对应的格子
    public GameObject slotGrid;
    public Text itemDes;//物品描述

    private void OnEnable()
    {
    
    
        RefreshItem();
        itemDes.text = "";
    }

    public void CreatGUIItem(Item item)
    {
    
    
        Slot newItem = Instantiate(slot, slotGrid.transform, false);//为item,实例化一个slot并赋值
      
        newItem.soltItem = item;
        newItem.name = item.name;
        newItem.number.text = item.number.ToString();
        Debug.Log("显示的数量:" + item.number);

        //显示图片
        GameObject m_Image = Resources.Load(item.spritePath) as GameObject;
        newItem.soltImage = m_Image.GetComponent<Image>();
    }

    public void RefreshItem()//刷新数量,重新生成
    {
    
    
        for (int i = 0; i < instacne.slotGrid.transform.childCount; i++)
        {
    
    
            if (instacne.slotGrid.transform.childCount == 0)
            {
    
    
                Debug.Log("没有物体可销毁");
                break;
            }
            Destroy(instacne.slotGrid.transform.GetChild(i).gameObject);
            Debug.LogError("Destory");
        }

        //foreach (var item in bag.Mydata.bagData)
        //{
    
    
        //
        //    CreatGUIItem(item);
        //}
        for (int i = 0; i < bag.Mydata.bagData.Count; i++)
        {
    
    
            Debug.Log("重新生成");
            CreatGUIItem(bag.Mydata.bagData[i]);
        }
    }
}

Usamos for o foreach para recorrer los datos de la mochila, crear un espacio para cada artículo y asignar los datos del artículo al espacio. Agregamos un botón al solt y, cuando se hace clic, la descripción del artículo se asigna a la posición de la descripción de la GUI de la mochila (debajo de la mochila)

using UnityEngine;
using UnityEngine.UI;

public class Slot : MonoBehaviour
{
    
    
    public Item soltItem;
    public string name;
    public Image soltImage;
    public Text number;

    public void ItemOnClick()
    {
    
    
        Debug.Log("点击solt");
        BagGuiManager.instacne.itemDes.text = soltItem.des;
    }
}

La ranura es prefabricada. Es la imagen que se muestra en la mochila. Tiene el número y los atributos de la imagen. Crear una ranura es crear la interfaz de usuario en la mochila.
La asignación de imágenes aquí usa el método de carga de recursos.
Primero, la imagen El prefabricado se coloca en el directorio de Recursos, y el prefabricado se carga según la ruta para obtener su imagen y asignar valores. (Como método de carga)

GameObject m_Image = Resources.Load(item.spritePath) as GameObject;
newItem.soltImage.sprite = m_Image.GetComponent<Image>().sprite;

Segundo, a través de Recursos. Cargar carga
genérica (método de carga genérico)

newItem.soltImage.sprite = Resources.Load<Sprite>(item.spritePath);//不能使用as Sprite,
//会失败,要使用泛型的加载

Inserte la descripción de la imagen aquí
Finalmente, necesitamos actualizar la mochila GUI cada vez que agregamos un nuevo objeto, es decir, cuando encontramos un objeto en ItemOnWorld y lo agregamos a la mochila de datos, agregamos un paso para actualizar la interfaz GUI y llamamos al método SaveGame en BagManager
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Vincular con éxito los datos de la mochila con la GUI de la mochila.
Inserte la descripción de la imagen aquí
Finalmente, llamamos al método de lectura en el script de la mochila. Al comienzo de cada juego, leemos los datos de Json y actualizamos la GUI de la mochila.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Cuatro, código de referencia completo

using UnityEngine;
using UnityEngine.UI;

public class BagGuiManager : MonoBehaviour
{
    
    
    public static BagGuiManager instacne;

    private void Awake()
    {
    
    
        if (instacne != null)
        {
    
    
            Destroy(this);
        }
        instacne = this;
    }

    [Header("背包")]
    public BagManager bag;

    public Slot slot;
    public GameObject slotGrid;
    public Text itemDes;

    private void OnEnable()
    {
    
    
        RefreshItem();
        itemDes.text = "";
    }

    public void CreatGUIItem(Item item)
    {
    
    
        Slot newItem = Instantiate(slot, slotGrid.transform, false);
        //newItem.gameObject.transform.SetParent(slotGrid.transform,false);//设置父物体
        newItem.soltItem = item;
        newItem.name = item.name;
        newItem.number.text = item.number.ToString();
        Debug.Log("显示的数量:" + item.number);

        //显示图片
        
        //GameObject m_Image = Resources.Load(item.spritePath) as GameObject;
        //newItem.soltImage.sprite = m_Image.GetComponent<Image>().sprite;//做成预制体,然后通过加载预制体赋予图片,as 加载方式

        newItem.soltImage.sprite = Resources.Load<Sprite>(item.spritePath);//不能使用as Sprite,会失败,要使用泛型的加载
    }

    public void RefreshItem()//刷新数量,重新生成
    {
    
    
        for (int i = 0; i < instacne.slotGrid.transform.childCount; i++)
        {
    
    
            if (instacne.slotGrid.transform.childCount == 0)
            {
    
    
                Debug.Log("没有物体可销毁");
                break;
            }
            Destroy(instacne.slotGrid.transform.GetChild(i).gameObject);
            Debug.LogError("Destory");
        }

        //foreach (var item in bag.Mydata.bagData)
        //{
    
    
        //
        //    CreatGUIItem(item);
        //}
        for (int i = 0; i < bag.Mydata.bagData.Count; i++)
        {
    
    
            Debug.Log("重新生成");
            CreatGUIItem(bag.Mydata.bagData[i]);
        }
    }
}
using UnityEngine;
using UnityEngine.UI;

public class Slot : MonoBehaviour
{
    
    
    public Item soltItem;
    public string name;
    public Image soltImage;
    public Text number;

    public void ItemOnClick()
    {
    
    
        Debug.Log("点击solt");
        BagGuiManager.instacne.itemDes.text = soltItem.des;
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemOnWorld : MonoBehaviour
{
    
    
    //[Header("物体所属的背包")]
    //public BagManager Bag;

    private Item item=new Item();
    [Header("物体属性")]
    public string name;
    public int number;
    public string des;
    public string type;
    public string spritePath;


    private void Awake()//将属性赋予物体
    {
    
    
        item.name = name;
        item.number = number;
        item.des = des;
        item.type = type;
        item.spritePath = spritePath;
    }

    private void OnCollisionEnter(Collision collision)
    {
    
    
        if (collision.gameObject.CompareTag("Player"))
        {
    
    
            AddNewItem();
            Destroy(this.gameObject);
        }
    }

    private void AddNewItem()
    {
    
    

        foreach (var m_item in BagManager.instacne.Mydata.bagData)//检测有没有同名物体,没有就添加
        {
    
    
            if (m_item.name==item.name)
            {
    
    
                m_item.number += number;
                Debug.Log("物体:" + item.name + ",的数量:" + m_item.number);
                BagGuiManager.instacne.RefreshItem();
                return;
            }

        }
        BagManager.instacne.Mydata.bagData.Add(item);
        Debug.Log("加入物体");
        BagGuiManager.instacne.RefreshItem();
        // BagGuiManager.instacne.CreatGUIItem(item);

    }
}

5. Dirección del almacén

https://github.com/euphoriaer/Mybag.git

Supongo que te gusta

Origin blog.csdn.net/euphorias/article/details/108901074
Recomendado
Clasificación