文档章节

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

小姚
 小姚
发布于 2014/08/30 11:16
字数 767
阅读 3482
收藏 6
客户端编辑器主要的作用是把配置文件(格式是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.完成。


© 著作权归作者所有

小姚
粉丝 30
博文 135
码字总数 41380
作品 0
广州
程序员
私信 提问
加载中

评论(2)

小姚
小姚 博主

引用来自“KingStyle”的评论

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

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

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

qibawangla
2015/03/18
311
0
Unity MMORPG游戏开发教程(一)——初识Unity

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑。本系列文章以C#为介绍语言,基于Unity2017.4.x。 一、环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己搜资料,步骤差不多...

五邑隐侠
03/06
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
1K
1
关于AnimationClip在PC下加载缓慢的问题分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/UWA4D/article/details/99418161 这是侑虎科技第594篇文章,感谢作者...

UWA
08/13
0
0
VR这么火,你选UE4还是Unity 3D?

在虚拟现实大热的今天,开发者界也出现了“甜豆花”与“咸豆花”之争。在游戏开发者制作游戏时,面对都是免费、都支持各大平台的UE4和Unity 3D,选择何种游戏引擎,似乎有点难以抉择,左手U...

1405048499729402
02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
8分钟前
1
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
36分钟前
2
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
今天
4
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
今天
5
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部