【Unity3d】ScriptableObject介绍和简单的本地排行榜实现
来源:互联网 发布:mac常用快捷键 编辑:程序博客网 时间:2024/05/17 09:01
最近有个项目中需要实现一个排行榜系统,只需显示排名和分数,一开始想用sqlite做一个简单的数据库,但是在写文件的时候发现,由于sqlite只支持单线程的写操作,所以在更新排行榜的时候会出现数据库lock的现象。由于排行榜十分简单,所以想着不如用ScriptableObject来实现。当然设计一下感觉ScriptableObject也是可以用来实现数据库的功能的:-D。
ScriptableObject是一个可继承且不需要挂载在游戏物体上的类,我们可以使用继承了ScriptableObject的类来存储程序数据,例如配置,游戏中的角色信息等等,也可以存储一些预置方案来供程序选择。ScriptableObject会对数据进行序列化存储,如果我们需要设计一些比较复杂的类来存储信息,我们可以加上[Serializable]标记来对类指定的类进行序列化,同时也可以使用[NonSerialized]对特定的变量取消序列化,加了次标记的变量也不会出现在编辑面板上。有些类型如Dictionary是不能序列化的。
[Serializable]public class DataBase{ public string key; public string[] values; [NonSerialized] public int index;}
首先新建一个Class,继承ScriptableObject,这个类有一个int类型的数组变量scores用来存储排行榜中的分钟。项目需要显示前20名,所以我申请了一个长度为20的数组变量。代码如下:
public class HMDataBase : ScriptableObject{ public int[] scores = new int[20];}
然后重写HMDataBase类的Editor,代码如下:
[CustomEditor(typeof(HMDataBase))]public class HMDataBaseEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); }}public class HMDataBaseAsset{ [MenuItem("Assets/Create/HM DataBase", false, 0)] public static void CreateAsset() { HMDataBase asset = ScriptableObject.CreateInstance<HMDataBase>(); string path = AssetDatabase.GetAssetPath(Selection.activeObject); string fileName = "New HM DataBase"; string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath(path + "/" + fileName + ".asset"); AssetDatabase.CreateAsset(asset, assetPathAndName); AssetDatabase.SaveAssets(); EditorUtility.FocusProjectWindow(); Selection.activeObject = asset; }}
这样我们右键Project视图的Assets目录下的地方就能新建HMDataBase类型的asset文件,这个文件会被序列化,可以用来改修和存储项目中的排行榜信息:
然后我们在程序中定义一个HMDataBase的变量,就能对chart中的scores进行读写操作了。
public HMDataBase chart;public int ReadChartByID(int id){ if(id < 0 || id > 20) { Debug.Log(id out of range); return -1; } return chart.scores[id];}public void UpdateChart(int id, int score){ if(id < 0 || id > 20) { Debug.Log(id out of range); return; } chart.scores[id] = socre;}
我们可以为HMDataBase添加更多的方法以便进行数据的操作。
其实ScriptableObject可以实现的功能远不止这么简单,有时间我会设计一个复杂一点的类数据库系统,也方便以后程序的编写。之后会继续分享关于ScriptableObject的一些使用心得。
by:蒋志杰
- 【Unity3d】ScriptableObject介绍和简单的本地排行榜实现
- 关于Unity3D中ScriptableObject的介绍
- Unity3D ScriptableObject 简要介绍
- Unity3D 实现本地排行榜功能
- ScriptableObject 整理1 :ScriptableObject的介绍
- 【Unity】ScriptableObject的介绍
- 【Unity】ScriptableObject的介绍
- 【Unity】ScriptableObject的介绍
- ScriptableObject的介绍
- ScriptableObject的介绍
- Unity3D ScriptableObject序列化的应用
- Unity3D GameCenter 排行榜, 成就实现
- Unity3d ScriptableObject那些事
- Unity3D序列化ScriptableObject
- Unity3D ScriptableObject 一些坑
- 本地推送和远程推送的简单介绍
- [Unity3D]用ScriptableObject打包数据
- 【Unity3d】使用MovieTexture和Image实现简单的播放器
- 拷贝构造函数
- Oracle的基本语法
- hdu 3068马拉车模板题
- django create view
- iOS中修改APP的名称
- 【Unity3d】ScriptableObject介绍和简单的本地排行榜实现
- IIFE总结
- 浏览器兼容问题
- PIC18F45K80 USART
- 从0到1学习node(七)之express搭建简易论坛
- RxJava 入门(三)-- 操作符简介
- RabbitMQ基础概念详细介绍
- 类型转换构造函数
- 一个值得收藏的popupWindow