記事のディレクトリ
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);
}
}