目前我了解到的ScriptableObject的作用应该是可以把数据真正存储在了资源文件中,可以像其他资源那样管理它,就算你退出了程序,里面的数据也不会归零之类的。
言简意赅的说,这玩意可以保存你修改过的数据。
下面让我来详细说明一下如何运用这东西:
首先,我们在uinty里面,可以先创建一个项目脚本,名字就叫Item吧,
第一步,把Item:后面的 MonoBehaviour改为ScriptableObject;
public class Item : MonoBehaviour
/*改为下面这段话哦*/
public class Item : ScriptableObject
顺带说一下如何让自己右键菜单能创建属于自己的东西,CreateAssetMenu这样:
[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/New Item")]
public class Item : ScriptableObject
在public上面加一串这种代码,
emmm,fileName是创建后项目的名字,menuName的意思是它在菜单里的名字,
后面那个 “Inventoty/New Item” 为 文件夹名字/子菜单名字,效果是这样的:
(New Inventory是以后创建的东西,不用管他);
然后就可以在代码里添加item的元素啦,比如:
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; //道具是否能被装备
}
[TextArea]这个东西是将介绍从一行变成一大段,万一你捡到神器了怎么办?一行话怎能描写出神器的威能?
接下来终于可以创建自己的背包了myBag;
背包用的也是 ScriptableObject(笑死,不是的话游戏下线了自己啥装备也没了);
来一串代码:
[CreateAssetMenu(fileName = "New Inventory", menuName ="Inventory/New Inventory")]
public class Inventory : ScriptableObject
{
public List<Item> itemList = new List<Item>();
}
上面哪个叫New Inventory的不就出现了吗?
List</*类型*/>,背包就创建好了.
接下来回到unity里面创建一把剑,记得 collider里面要划上is trigger
再给这把剑创建一个脚本(大部分道具都需要的)
public class ItemOnWorld : MonoBehaviour
{
public Item thisItem;
public Inventory playInventory;
private void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.CompareTag("Player"))
{
AddNewItem();
Destroy(gameObject);
}
}
public void AddNewItem()
{
if(!playInventory.itemList.Contains(thisItem))
{
playInventory.itemList.Add(thisItem);
//Inventorymanager.CreatNewItem(thisItem);
}
else
{
thisItem.itemHeld += 1;
}
Inventorymanager.RefreshItem();
}
}
先理解一下,public了两个东西,一个是自己的所有元素,另一个是背包,下面那串代码是被角色碰到后添加道具和摧毁自身,AddNewItem里面
如果你有该道具,那么就数值加1,否则就添加道具!
然后再游戏里面试验的话发现持有度确实增加了,哪怕停止运行后再次运行持有数量依旧保留了,是不是很nice呢?
那些没有涉及到的方法,特指Inventorymanager,这个下次再总结(因为我也不大会);