C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
前言
最近项目不算太忙,终于有时间更新博客了。关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处理方案了。
不过前几篇发布的时候是2015年,比较早了,随着这几年技术不断积累和进步,其实已经有更好的方案来处理数据了,不过对于前端存储的那几个M的数据,多点少点其实影响也不大。
但是也不能就这样算了,毕竟技术的变化日新月异,还是要保持持续学习的心态。
虽然简单但却不易忽视
对于游戏中静态数据的处理,单纯的对于整个程序项目来说其实只是很小的一部分。写个读写工具,打个包,压个缩,加个密其实对于很
多程序来说也不是难事。但是,我又要说但是了。但是,根据博主的个人经验来说,数据对于游戏的业务逻辑是非常底层的“逻辑”,对于
后期的开发起到了一个基础的作用。主要体现在两个方面:
1.业务逻辑角度的数据结构化。
这点很关键,策划想要把自己大脑里的游戏玩法用数据表示出来,而这个表示过程其实是需要程序配合的,因为不可能每个策划
都那么牛逼,然而现实情况也确实如此。因此,这部分要做的事就是,用数据抽象的思维把策划描述的游戏世界表示出来,最终
体现就是“表格”。这些数据,其实就是游戏业务逻辑的“骨架”,后续的开发都是围绕着数据来做的,或者说被数据“支配”的。
2.程序结构的设计。
第一条说过了,“后续的开发都是围绕着数据来做的”,那么这些数据的使用频率必然会很高。那么,问题来了,如何设计这部分的程序结构会使开发效率和运行效率最优?单纯的创建一个类,把所有数据查询的方法都放里面?还是根据第一条抽象出来的“实体类”来组织数据,然后对数据做一些预处理,例如游戏运行先进行分类然后放到内存中等待使用?
显然,后者更加高效,这也“静态数据处理虽然简单,但是也不容忽视”的理由。
最新的方案
前面也说了,技术是不断在变化的,我们也需要快速适应。之前的方案确实用了很长时间,也没什么问题。但是自己撸的代码总有几个疑问?这是最好的方案吗?和最好的方案差距有多大?
带着这几个问题,在最近2年所做的项目中也对这方面做了一些工作:1,在最近的项目中使用了ScriptableObject的方式。2,开始了一个protobuf方式处理数据的开源项目。
说起来惭愧,其实结果影响并不算很大,下面把这部分总结一下。
方案一 : 使用Unity的ScriptableObject。
做法就是每个表格生成的数据类都直接或者间接的继承自ScriptableObject类,打包的时候直接把所有表数据都生成一个对应类型的.asset文件。然后建一个总的Map类来存放所有asset的引用,当然这个Map类也必须继承自ScriptableObject,也生成对应的.asset文件。最终打包的时候,只打这个Map类的.asset文件,Unity会自动识别里面的依赖关系,将所有数据打包进bundle。
实体类Hero
using UnityEngine;
public class Hero : ScriptableObject
{
public string name;
public string level;
}
Map类
using UnityEngine;
using System.Collections.Generic;
public class Map : ScriptableObject
{
public List<Hero> heroList = new List<Hero>();
}
最终在使用的时候也很方便:
AssetBundle bundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/constance");
Map m_Constance = bundle.LoadAsset("constance") as Map;
这种方式对Unity3D非常友好,使用起来也非常方便,但是缺点也是有的,下面来总结一下:
优点:
可以和预制产生依赖,prefab如果依赖了asset打包的时候也会打进去,减少了查找操作。
可以直接用Unity API操作asset。省去了一部分序列化反序列化代码。
可以直接用AssetBundle.LoadAsset() as Map;加载,省去了之前的反序列化代码。
在Unty中选中asset可以直接在Inpector中看到数据。
缺点:
生成asset的时候会有大量的文件操作,速度慢。
还有两个指标就是运行速度和存储空间。由于影响不大,没有做进一步测试。
存储空间的话,我这里有个参考:6个Excel文件占用的pc上的磁盘空间是112k,最终打成AssetBundle是31k。
方案二 : 使用protobuf
这种做法主要是通过google提供的protobuf来序列化和反序列化数据,并且使用protoc生成目标语言的代码。工作流程如下图所示。
把做法分成几部分来说:
操作1,读取excel数据描述信息,通过excel数据描述信息生成.proto文件。
操作2,使用protoc命令行生成本地代码,也就是你制作工具使用的语言代码。
操作3,创建本地代码的类的实例。
操作4,读取excel数据,并且将内容赋值给“操作3”创建的实例,最终使用protobuf API序列化。
操作5,生成目标平台的代码。
最终生成的二进制文件(.bytes)和目标代码会和程序一同发布,使用生成的目标代码解析生成的二进制数据。
具体代码就不贴出了,下面是本人对方案二开启的一个开源项目,用的是java+netbean8.2,目前已经完成大部分内容。
有兴趣的同学可以看一下。我会一直更新。
https://github.com/superbig/proto-packer
最后
如果你在游戏开发的静态数据处理方面还在犹豫,建议是:如果项目小可是试试ScriptableObject方式,应使用起来确实要方便一些。当然你也需要忍受数据导出时候的频繁的IO操作(当然其实你也可以开发一个增量导出的工具)。
如果项目大,数据很多还是老老实实用protobuf,空间占用少,速度快。或者自己写。
版权声明:本文为博主原创文章,未经博主允许不得转载。 http://www.cnblogs.com/fly-100/p/8707749.html
C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新的更多相关文章
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全
http://zhidao.baidu.com/link?url=pHZQvfWJzI-lQjl4uP86q4GLcpYHu4o-fdjiYegJS0Cy5HEq5oz0YrUye3iHjmv5CJ3 ...
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- hbase使用MapReduce操作4(实现将 HDFS 中的数据写入到 HBase 表中)
实现将 HDFS 中的数据写入到 HBase 表中 Runner类 package com.yjsj.hbase_mr2; import com.yjsj.hbase_mr2.ReadFruitFro ...
- sql之将一个表中的数据注入另一个表中
sql之将一个表中的数据注入另一个表中 需求:现有两张表t1,t2,现需要将t2的数据通过XZQHBM相同对应放入t1表中 t1: t2: 思路:left join 语句: select * from ...
- 使用spark将内存中的数据写入到hive表中
使用spark将内存中的数据写入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" st ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
随机推荐
- 【Luogu1471】方差(线段树)
[Luogu1471]方差(线段树) 题面 这种傻逼题...自己去看把.. 题解 这题太傻比了 把方差公式拆开 维护平方和和区间和 修改就把平方和的公式拆开 简直傻逼的题目 #include<i ...
- 【learning】二分图最大匹配的König定理
[吐槽] 嗯好吧这个东西吧..其实是一开始做一道最小点覆盖的题的时候学到的奇妙深刻的东西 然后发现写了很长 然后就觉得不拎出来对不起自己呀哈哈哈哈 咳咳好的进入正题 [正题] 在这里码一下最小点覆盖的 ...
- 人生苦短,我用python(目录)
基础 简介 数据类型 文件操作 迭代器和生成器 函数 内置函数 面向对象编程 异常处理 socket网络编程 线程 进程/协程/异步I/O 数据库 Mysql(一) Mysql(二) Mysql(三) ...
- 【Unity3D与23种设计模式】单例模式(Singleton)
GoF中定义: "确认类只有一个对象,并提供一个全局的方法来获取这个对象" 使用单例模式的前提 它只能产生一个对象且不能够被继承 单例模式的优点: 提供方便获取唯一对象的方法 可以 ...
- EventBus VS Spring Event
EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...
- 微信公众号开发 VS2015本地调试
1.部署一个微信公众号服务在本地IIS: 2.下载一个ngrok 穿网工具,放到部署文件夹根目录: ngrok穿网 在部署路径下打开cmd,输入 ngrok http [端口号] 4.将映射的URL ...
- unix命令
最近需要用到一些Unix的东西 ,就学习了下这个东西,简单记录下命令,方便以后查询! 1. ls这是最基本的档案指令. ls 的意义为 "list",也就是将某一个目录或是某一个档 ...
- 简单了解C语言内嵌汇编
最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmp ...
- Linux最佳的云存储服务分析
什么样的云服务才适合作为 Linux 下的存储服务?兄弟连www.itxdl.cn来帮大家分析一下! 大量的免费空间.毕竟,个人用户无法支付每月的巨额款项. 原生的 Linux 客户端.以便你能够方便 ...
- Mycat 分片规则详解--取模分片
实现方式:切分规则根据配置中输入的数值n.此种分片规则将数据分成n份(通常dn节点也为n),从而将数据均匀的分布于各节点上. 优点:这种策略可以很好的分散数据库写的压力.比较适合于单点查询的情景 缺点 ...