Jsonを使用してバックパックシステムのデータストレージを実現します(2つ)

1.アートの準備(斧になる)

拾う対象としてブレンダーで斧を作ります。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに置いてみると、テクスチャの色が少し変わっていることがわかります。ここではURPを使用しています。理由はわかりません。皆さんにアドバイスをお願いしたいと思います。解決していただきありがとうございます。

2つ目は、JsonデータがGUIインターフェイスに接続されていることです。

斧を食べるたびに、斧データをバックパック(バックパッククラスのリスト)に
入れる必要があるため、ワールドオブジェクトとバックパックデータ間の相互作用であるItemOnWorldが必要です。

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("加入物体");
    }
}

これをオブジェクトに掛け、パラメータを入力してから、テストし、5つの軸をコピーして、データがバックパックデータに正しく追加されているかどうかを確認します。
ここに画像の説明を挿入
テストは成功します。
ここに画像の説明を挿入

第三に、データをバックパックのインターフェースにリンクします

、GUIインターフェイスを管理するためのBagGuiManagerスクリプトを作成します。このスクリプトを使用して、バックパックデータに基づいて対応する画像を作成するだけです。
バックパックを更新するRefreshItemメソッドを記述します(バックパックデータに基づいてオブジェクトを再生成します)
CreatGUIItemは、受信アイテムに従ってスロットを割り当てます(バックパック内のアイテムデータに基づいてGUIを生成する特定の実装)

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]);
        }
    }
}

forまたはforeachを使用して、バックパックデータをトラバースし、アイテムごとにスロットを作成し、アイテムデータをスロットに割り当てます。ソルトにボタンを追加し、クリックすると、アイテムの説明がバックパックのGUI説明の位置(バックパックの下)に割り当てられます。

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;
    }
}

スロットはプレハブです。バックパックに表示される画像です。画像の数と属性があります。スロットの作成は、バックパックにUIを作成することです。
ここでの画像の割り当てでは、リソースの読み込み方法を使用します。
まず、画像プレハブはResourcesディレクトリに配置され、パスに従ってプレハブがロードされ、画像を取得して値が割り当てられます。(読み込み方法として)

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

次に、Resouces.Loadジェネリックローディング
(ジェネリックローディング方式)を介して

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

ここに画像の説明を挿入
最後に、新しいオブジェクトを追加するたびに、つまりItemOnWorldでオブジェクトを検出してデータバックパックに追加するたびに、GUIバックパックを更新する必要があります。GUIインターフェイスを更新するステップを追加し、BagManagerでSaveGameメソッドを呼び出します。
ここに画像の説明を挿入
ここに画像の説明を挿入

バックパックデータをバックパックGUIに正常にリンクします。
ここに画像の説明を挿入
最後に、バックパックスクリプトでreadingメソッドを呼び出します。各ゲームの開始時に、Jsonデータを読み取り、バックパックGUIを更新します。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

4、完全なコードリファレンス

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.倉庫の住所

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

おすすめ

転載: blog.csdn.net/euphorias/article/details/108901074