赞
踩
ScriptableObject类和MonoBehaviour是并列的,都继承自Object,它可以用来存储大量的数据,并且它是可序列化的,这个特点也正决定了它的一个主要用处就是通过将数据存储在ScriptableObject对象中来减少工程以及游戏运行时因拷贝值所造成的内存占用;
在一个游戏场景中我们往往会用到大量的预制体,对于一个预制体如果我们只想修改它部分的值来让它变成一个不同数据的预制体,那么我们在保留原有预制体的情况下就必须新创建一个预制体,这样就会消耗内存空间;相反如果我们把它做成ScriptableObject,那么我们在创建一个新的预制体的时候只需要引用ScriptableObject中的数据即可,然后生成我们想要的物体,并不会产生多余的内存,并且这些数据也会在游戏运行结束后保存。
创建一个脚本,脚本名称可以起你想要存储物品类型的名称,点击脚本后开始编辑,注意要继承ScriptableObject类,可以在脚本中定义私有或公有变量用于存储数据。
using System.Collections; using System.Collections.Generic; using UnityEngine; //fileName定义的是创建出来的ScripetableObject的默认命名 //MenuName是在Assers下右键单击后Create后面的选项的名称 //加上‘/’可以设置多个层级,可以定义多个类似于Ttem的脚本放置于同一个根选项下 [CreateAssetMenu(fileName ="New Item",menuName ="Item/new Item")] public class Items : ScriptableObject //需要继承ScriptableObject类 { public string name = "Z_hongli"; public int number = 123456; public int age = 20; public int score = 90; }
创建好后保存,我们可以在Assets下右键单击创建我们定义的ScriptableObject用于存储数据
点击创建好的存储文件我们可以修改其名称,同时也可以在外部修改其内部变量
我创建了一个Student脚本,同时将创建的ScriptableObject物体改名叫StudentInformation用于存储数据,student脚本如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Student : MonoBehaviour { //创建一个Items类作为保存数据的数据库,这里我们已经创建好了,就是StudentInformation public Items thisitems; public string name; public int number; public int age; public int score; void Start() { Read_data(); } void Update() { if(Input.GetKeyDown(KeyCode.A)) { score = score + 10; Debug.Log("更新后的分数为:"+score); } if(Input.GetKeyDown(KeyCode.D)) { Save_data(); Debug.Log("保存成功!"); } } public void Read_data() { score = thisitems.score; Debug.Log("初始分数为:" + score); } public void Save_data() { thisitems.score = score; } }
回到Unity中创建一个空物体我更名为Student,将Student脚本拖拽给它,同时将我们定义的“数据库”实例化
下面是运行脚本后的测试,可以看见能够成功的保存相关数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。