ScriptableObject类允许开发者不用将脚本作为组件加载在物品上也能调用,而且还可以用来存储数据。
首先新建一个类用来作为存储物品数据的基类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="New Item",menuName = "Inventory/New Item")]
public class Item : ScriptableObject
{
public string itemname;//道具的名字
public Sprite itemimage;//道具的图片
public int itemHeld;//道具数量
//文本区域
[TextArea]
public string iteminfo;//道具的信息
public bool equip; //是否可以被装备
}
然后就可以在项目的创建菜单中,找到Inventory,里面就会出现New Item,点击并创建。
通过这一途径会新建一个继承了Item的Assets,继承了Item里面的数据成员。
通过同样的方法,新建一个类用来作为物品列表的基类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="New Inventory",menuName ="Inventory/New Inventory")]
public class Inventory : ScriptableObject
{
public List<Item> itemlist = new List<Item>();//物品列表
}
同样的方法,建立一个Assert来作为管理物品的列表
我这里设定为,当鼠标点击某一物品,在该物品的ItemHeld上加1,若物品数量为零,则列表中新增一个。
首先,给被点击的物品加上一个collider组件,IsTriger可勾可不勾,主要时用来接收鼠标的点击。然后挂上脚本。
脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemOnWorld : MonoBehaviour
{
public Item ThisItem;
public Inventory PlayInventory;
private void Start()
{
ThisItem.itemHeld = 0;//重新加载游戏时清零
}
private void OnMouseDown()//当被鼠标点击时
{
Debug.Log("3");
AddNewItem();
//Destroy(gameObject);
}
public void AddNewItem()//在列表中加入这个物品
{
if (!PlayInventory.itemlist.Contains(ThisItem))
{
PlayInventory.itemlist.Add(ThisItem);
}
else
{
ThisItem.itemHeld = ThisItem.itemHeld + 1;
}
}
}
原文:https://www.cnblogs.com/wei1349/p/12879474.html