文档章节

Unity3d游戏项目客户端配置数据编辑器实现步骤

小姚
 小姚
发布于 2014/08/30 11:16
字数 767
阅读 3418
收藏 6
点赞 0
评论 2
客户端编辑器主要的作用是把配置文件(格式是Excel)序列化生成二进制文件,在游戏中进行加载使用。


通过对别的项目的编辑器的学习,了解到一种实现方式:
    1.使用Flex生成桌面程序,利用as3xls操作Excel获得数据
    2.生成前端的vo.cs和对应的xml,后端文件
    3.生成C#的桌面程序
    4.加载vo.cs,利用反射生成对应的对象
    5.加载xml,把xml的值通过反射设置进对象中
    6.通过序列化生成文件

通过这种实现方式,每次生成配置的时候,就需要操作两个工具,个人觉得不如直接使用C#桌面程序读取Excel。
    1.生成C#桌面程序
    2.使用Oledb读取读取Excel(C#读取Excel有几种方式,百度即可)
    3.生成vo.cs文件
    4.反射生成vo对象,设值对象
    5.序列化
在实现以上步骤的过程中,碰到过了不少问题。


1.使用Oledb读取Excel,要同时考虑到.xls和.xlsx文件:

//2003(Microsoft.Jet.Oledb.4.0)
string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);
//2010(Microsoft.ACE.OLEDB.12.0)
string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);


2.创建字符串保存vo.cs文件,然后使用反射根据字符串动态创建对象。


CSharpCodeProvider provider = new CSharpCodeProvidor(); //创建编译器
CompilerParameters paras = new CompilerParameters(); //设置编译参数
paras.ReferenceAssemblies.Add(“System.dll”);
paras.GenerateExecutable = false;  //编译成exe还是dll
paras.GenerateInMemory = true; //是否写入内存,不写入内存就写入磁盘
CompilerResults result = provider.CompileAssembleyFromSource(paras, sourceCode(对象的字符串代码)); //编译代码
Assembly as = result.CompiledAssemble; //获得编译后的程序集
Object obj = as.CreateInstance(“ com.game.vo.voName”);  


3.通过反射把excel中的值设置进obj


4.把设值好的对象保存进ArrayList当中,对其进行序列化,并保存成 vo.bytes,这里之所以保存成.bytes,是为了在unity中加载(储存文件的扩展名以" .bytes"为结尾的二进制数据。Unity会把它们看成TextAsset来使用。):


public byte[] SerializeBinary(object  request)    
        {  
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();  
            System.IO.MemoryStream  memStream  =  new  System.IO.MemoryStream();  
            serializer.Serialize(memStream, request);  
            return  memStream.GetBuffer();  
        } 
        
5.把生成好的vo.bytes以及vo.cs放到Unity3d项目中


6.使用Unity3d把vo.bytes文件打包成assetBundle文件 (这个步骤是对文件进行压缩,减少文件尺寸)


7.运行Unity3d项目,加载打包好的vo.assetBundle文件,加载成bytes:


string url = "http://www.mywebsite.com/mygame/assetbundles/vo.assetBundle"; IEnumerator Start () { // Start a download of the given URL WWW www = WWW.LoadFromCacheOrDownload (url, 1); // Wait for download to complete yield return www; // Load and retrieve the AssetBundle AssetBundle bundle = www.assetBundle; // Load the TextAsset object TextAsset txt = bundle.Load("myBinaryAsText", typeof(TextAsset)) as TextAsset; // Retrieve the binary data as an array of bytes byte[] bytes = txt.bytes; }


8.反序列化二进制得到配置数据,这里要注意一点就是前面生成的vo.cs文件必须放在com.game.vo目录下,否则反序列化会报找不对vo对象。


public object DeserializeBinary(byte[] buf) 
        { 
            System.IO.MemoryStream memStream = new MemoryStream(buf); 
            memStream.Position = 0; 
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer = 
                new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
            object newobj = deserializer.Deserialize(memStream); 
            memStream.Close(); 
            return newobj; 
        } 


9.完成。


© 著作权归作者所有

共有 人打赏支持
小姚
粉丝 29
博文 132
码字总数 40957
作品 0
广州
程序员
加载中

评论(2)

小姚
小姚

引用来自“KingStyle”的评论

我也准备学unity3d了,虽然看不懂但是收藏了

哈,等到你有这个需求了就自然懂....写得有点概括~!
随意丶nice
随意丶nice
我也准备学unity3d了,虽然看不懂但是收藏了
kbengine mmo源码(完整服务端源码+资源+完整客户端源码)

本项目作为kbengine服务端引擎的客户端演示而写 更新kbengine插件库(https://github.com/kbengine/kbengineunity3dplugins): * 使用git命令行,进入到kbengineunity3dwarring目录执行: git s...

qibawangla
2015/03/18
0
0
unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:Program Files (x86)UnityEditor 运行exe 点击Browse,选择文件夹C:Program Fil...

润物互动技术团队博客
2014/10/28
0
1
微信小游戏即将开放?有我们在,你还赶得上!(如何在完全不懂服务器开发的情况下做一个实时联网对战的微信小游戏)

根据微信官方对外公开的消息,微信小游戏的脚步越来越接近了。它的开发者资格门槛和使用者门槛都很低,以后必将引爆一波"全民开发小游戏"浪潮。 官方的开发工具创建项目即可获取 的源码,这是...

大王12
03/30
0
0
【Unity3D基础概念】给初学者看的Unity概览(一):GameObject,Compoent,Time,Input,Physics

点击进入我的新博客 作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢! Unity3D重要模块的类图 最近刚刚完成了一个...

王选易
2014/05/29
0
0
白鹭引擎 5.3.0 正式发布,支持 3D 游戏开发

一直关注白鹭引擎的童靴会发现,今天白鹭引擎先后完成了白鹭引擎5.2.0、白鹭引擎5.3.0两个版本的更迭,在周三发布《白鹭引擎稳定版即将发布,后续路线图同步公开》文中,我们已详细介绍了白鹭...

白鹭科技
05/25
0
0
Unity联网对战游戏小Demo

前言 开发3D游戏听起来门槛很高,但是Unity的出现让门槛大大降低。开发联网实时对战的3D游戏门槛就更高,因为即便熟悉掌握了Unity的开发技术,联网的游戏还要涉及到熟悉网络协议栈、掌握后端...

大王12
03/26
0
0
我不是九爷 带了解 Unity3D与VR虚拟现实

  对于大多数人来说,可能不知道Unity3D是什么,但是却知道VR虚拟现实是什么,更不会把VR虚拟现实和Unity3D联系在一起,外行的人根本不知道这两者之间有什么关系。那么,今天来给你讲解一下...

李伟铭k
07/09
0
0
【Unity3D技术文档翻译】第3.6.2 使用预计算光照

上一章:【Unity3D技术文档翻译】第3.6.1篇 Enlighten概述 本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Enlight...

何三思
昨天
0
0
Playmaker Input篇教程之Playmaker购买下载和导入

Playmaker Input篇教程之Playmaker购买下载和导入 Playmaker Input篇认识Playmaker Playmaker是Unity的插件,其标志如图1-1所示。开发者使用它可以快速的将自己的游戏创意实现出来,而不必纠...

大学霸
2015/05/21
0
0
Unity中资源动态加载的几种方式比较

初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安装包里,没有到的不会跟进去。我们在编辑器里看到的Asset中的文件结构只是工作于编辑器环境下的,在游...

千山万水
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
21分钟前
10
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
23分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
37分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
56分钟前
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部