我的unity3d导入模型 4.3.4免费版不能导入第三方插件,这为啥?

在Mac上装了Unity 4.3.4f1真是冒气_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:29,359贴子:
在Mac上装了Unity 4.3.4f1真是冒气收藏
本来装了后想要享受30天PRO版的,点了30天输了账号,ok没问题,当我断了网再开就开始说我的证书过期了,我知道我的账号使用了N回了,但是在Win上都是屡试不爽的,这是逼我使用破解版吗,好我就破了你,然后就开始了替换破解文件的征程,悲剧了还是证书过期,我了个去这都替换了好伐,难道天亡我也只能使用免费版了,那就去使用免费版吧,使用了免费版了,心不甘啊,❤中不由失望起来,突然灵光闪过,何不用CheanAPP将Unity彻底干掉呢,然后重装ok破解成功了哈哈
恭喜楼主成功破了unity
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或阅读:62141回复:700
uLua最新的Unity+Lua热更新解决方案!!!【技术综合贴】
发布于: 17:18
看了坛子上同学用Kopilua,以为真的跨平台没问题,就实验了安卓手机,然后就开始铺游戏框架,干了一星期到昨晚想起来到ipad上跑跑,然后我跟我的小Demo一起崩溃了。今天搜索luajit,终于在u3d官方论坛终于发现了真正支持IOS+安卓(老外说web也支持,没测试)的插件,有些小兴奋,还是半信半疑的心态测试了下,果不其然运行在我的ipad2上面了,至少我运行代码非常正常。免费给大家上传我测试过的工程,有问题一起研究吧。补上:安卓也测试了游戏框架么问题,能正常使用的。今天在IOS上测试下更新的游戏框架了,问题不大。最近太忙了,没时间过来,为了方便技术交流,可以加群【Unity Lua技术交流QQ群】:
关于对slua两次挑衅的被逼回应&ulua真实性能测试报告
最新版本下载地址:
& 目前已有众多上线商业游戏使用ulua技术,查看案例 : 势不可挡啊~~~谁与争锋
针对大家的需求,我从当前游戏里剥离出一个迷你游戏框架,传送门:
uLua&SimpleFramework入门视频教程网盘地址(更新中...)
本部分内容设定了隐藏,需要回复后才能看到
感谢大家群策群力,ulua的使用越来越多。我以后会在帖子上贴一些同学们的经验思路,分享给大家。供借鉴。
“”同学基于ulua开发的tolua c#版,co2dx同学懂得。极大提升ulua的效率的插件,懂的入,传送门:
“”同学共享出来的ulua bug fix解决方案,大家不要错过,遇到了直接穿越吧,传送:
“”同学再次共享的Unity3D Lua中使用协程coroutine和计时器timer 传送门:
&&同学深入ulua编译文章uLua运行LuaJIT编译后的bytecode文件 传送门:
来自UnityLua群里“赵欣悦”同学无私奉献的热更新思路:我从最开始说下我的思路吧。通过版本号来判断是大更新还是小更新,游戏初始化的时候,先下载最新版本号和当前版本号比对。如果需要小更新,那么下载一个需要更新的表,通过表去下载各种资源和脚本的AssetsBundle。其中包括了一个数据文件,是当前版本中,会被lua托管的函数列表。然后以函数名作为key存在一个字典中,准确的说是 类名_函数名,这个也是我们所有lua脚本的文件名。在程序运行的时候,每个函数调用最开始判断一下这个函数是否存在于字典中。如果不存在,执行C#脚本。如果存在,判断字典中当前项的TextAsset是否为空,为空的话,从AB中加载,并DoString。如果不为空,直接DoString。这样就执行了更新上去的Lua脚本了,函数就return掉,不执行C#脚本了。新增的所有面板都用同一个C#脚本去管理,这个C#脚本只是lua的入口,可以通过管理器去赋值。
----------------------------------------------------------------------------------------------------------------------------------------------------
但是,发现一些地方需要注意下:
(1)
&local button = child(&buttonName&).gameO
&UIEventListener.Get(button).onClick = OnC
这个事件关联代码在iOS下是报错的,不能够正确执行(安卓没事),感谢同学提示:“这个事件关联代码在iOS下是报错的,不能够正确执行(安卓没事)” ulua的README.txt里最后一段有说明。 所以,只要在CheckType.cs的第一行定义#define __NOGEN__,那么所有平台使用这种代码都会报错了。如果要发布ios平台的话,建议定义上去,方便日常开发。
后发现坛子同学找到添加托管的方法,抄袭一下,希望不介意哈:uLua扩充对delegate的绑定支持
参考nlua中的做法,只需要注册一个委托类型即可,作者将这部分代码合并入了ulua
c#:
&& &class LuaBoolDelegateEventArgsHandler : LuaInterface.LuaDelegate {
&& & & &bool CallFunction(GameObject go) {
&& & & & & &object[] args = new object[] { go };
&& & & & & &object[] inArgs = new object[] { go };
&& & & & & &int[] outArgs = new int[] { };
&& & & & & &return (bool)base.callFunction(args, inArgs, outArgs);
&& & & &}
&& &} & &
& &public delegate bool BoolDelegate(GameObject go);
& &public BoolDelegate OnS
& &RegisterLuaDelegateType(typeof(CallbackTest.BoolDelegate), typeof(LuaBoolDelegateEventArgsHandler));
&& & &public static void RegisterLuaDelegateType(Type delegateType, Type luaDelegateType) &{
&& & & & & &m_LuaState.RegisterLuaDelegateType(delegateType, luaDelegateType);
&& & &}
lua:
&local callbackTest = test:AddComponent(&CallbackTest&);
&callbackTest.OnStart = function (gameObject)
&& & print(&callback sucess!&);
&& & return gameObject.Name ==
&end
但是我们通过Lua通知C#的添加方式,绕过了这个问题。PS:非常感谢同学的下述代码贡献!!!!解决了此问题。
public static void AddClick(GameObject go,object lua){
& UIEventListener.Get(go).onClick += delegate(GameObject o){
& LuaFunction func = (LuaFunction)
& func.Call();
(2)刚才发现一个有关注释的问题,也一并记录下。Lua代码与注释不用同行,否则lua执行会出错,估计跟中文注释有关系。我们的做法是,最终打包之前把所有txt里面的单独行注释铲除掉,即可运行正常了。(如果你的lua代码有中文,打包之前千万删除掉,今天我们测试print里面也不能有中文)
非常感谢同学搞定了中文编码的解决办法呢,非常棒!~,以下是解决方案(借花献佛啦):
Lua.cs Line159
if (LuaDLL.luaL_loadbuffer(L, chunk, chunk.Length, name) != 0)
if (LuaDLL.luaL_loadbuffer(L, chunk, System.Text.Encoding.UTF8.GetByteCount (chunk), name) != 0)
if (LuaDLL.luaL_loadbuffer(L, chunk, chunk.Length, chunkName) == 0)
if (LuaDLL.luaL_loadbuffer(L, chunk, System.Text.Encoding.UTF8.GetByteCount (chunk), chunkName) == 0)
原因就是对于中文等双字节字符,string.Length的返回值是把一个汉字当一个计数的,这样底层的库去parser时候就等于没读完整啦~
这样一个简单的修改就可以让ulua支持中文了,在楼主给的包里修改出中文输入输出已测试通过。 至于其他的读取接口比如读文件啥的貌似直接都用的bytes.Length,理论上没有问题的。 当然,大前提是lua文件本身的编码要存成UTF8。
(3)看到大家很多人开始使用ulua,觉得自己辛苦没白费,当然ulua作者我也不认识,我就是想把新的插件介绍给大家使用,填补上u3d不能热更新的坑。希望大家把ulua还不是很好的地方跟想法报出来,有种贡献,将来你遇到问题了,别人才能也反过来帮你。lua里面是没有等待时间的,至少我比较笨,没有用lua的协同怎么实现等待时间,但是觉得应该可以。我就用lua通知c#等待一段时间后,再反过来调用lua协调的继续函数,来模拟。可能效率会不好,但是没别的想法,有办法的朋友贴上来,补在这后面也好。
(4)关于有些网友问有了unilua,为啥还需要这个?我在这里回答下,别问了哈。unilua是云风团队阿南的作品,想必云大神的技术必然不会差了,尤其在运行效率下,但是,关于怎么通过unilua调用附加在gameobject上的自定义c#脚步一直闹不明白,而且也跑到他们的开源地址问过了,阿南回答我说他也不清楚。有一个运行lua代码的入口的开发方式使用传统的开发模式应该可以,也就是说要全部用lua开发逻辑,目前我还没想到怎么弄,但是想必大家用ngui或者其他组件的人不少,比如我们的《Q灵三国》就是基于ngui开发的,假如修改一个uilabel的text的内容,就不知道怎么办了,即使你是用lua动态创建的文本框,你也改不了,除非你完全不用ngui,而是用u3d的gui来做。ulua解决了我这个难题,导入一下使用的自定义类(导入类之前先载入命名空间:luanet.load_assembly('Assembly-CSharp')才可以的),比如下面的demo类,或者导入一些ngui的组件类(uilabel或者uisprite等),就能让我能顺利的走下去。所以才用ulua来开发。
(5)kopilua跟ulua都是用的luainterface,所以基本上兼容,可是kopilua没有提供错误堆栈跟踪,导致我们的前端跟我抱怨查错很麻烦,对于一个开发的中大型项目来说很累,也经常混淆弄错的地方,ulua提供了错误堆栈跟踪,所以一出错就能看到在什么地方,出了什么问题,减轻了很多不必要的麻烦。
(6)有朋友问怎么用NGUI实现动态界面,这个属于公司技术细节,我不好说太详细,说个大概的思路吧,看大家自由发挥,我们的也未必就是最好的技术解决方案。我们也就是用的Assetbundle,把每个面板Prefab跟与其相对应的lua脚本都打包成一个Assetbudle(相对应的NGUI的Atlas跟材质、纹理都会被打包进去,记得使用关联素材,否则你的资源会重复,而且很大,浪费玩家流量跟内存),然后使用了《Q灵三国》的动态更新系统代码,把最新的面板资源下载到本地,从Assetbundle里面读取Prefab资源出来,然后上面附加一个公用的C#脚本,并且这个C#脚本会启动lua脚本,这样,每个面板都可以自动更新,附加在上面的lua脚本也能动态更新,即可实现对UI的控制。
(7)其实有个很简单的require的替代方案:把lua代码打包进Assetbundle里面的吧,那好,可以在面板的c#桥里面写个函数,就2行代码即可完成了,比如:
void RequireLua(string name) {
& TextAsset luaCode = bundle.Load(name, typeof(TextAsset)) as TextA
& lua.DoString(luaCode.text);
}
每次Lua代码里面需要其他lua,RequireLua('lua2.lua'),然后就可以调用了。这样lua2.lua照样可以动态更新!
(8)感谢Unity Lua群里的“康”同学发现再补充的一个坑:最新发现luainterface还有个bug
local v1=Vector3(1,1,1)
local v2=Vector3(1,1,1)
v1.x = 100
print(v1.x, v2.x)
你会发现v2.x也变成100了。原因是luainterface用dictionary存储的vector, 而dict是用的object.hashcode()
所有的c# object都是存储在dict里的,任何对象的hashcode一样,都可能导致obj是同一个,而Vector的hash实现刚好是用x,y,z的值来计算的726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" onclick="if(this.parentNode.tagName!='A'&&this.width>screen.width-461) window.open(this.src);" />726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('/forum/attachment/1408/thread/16_725_51f569ddf4e5c27.jpg');" />
(9)EntryPointNotFoundException: luaL_newstate是大家遇到最多的错误,这个错误我遇到过,但是有些忘记怎么过它的了,当时没记录下来,后面就没遇到。解决办法:把除了Assets跟ProjectSettings目录之外的都删除掉,重新打开工程。
感谢同学找到问题所在:EntryPointNotFoundException: luaL_newstate这个错误是因为在如果在Unity中是设置了iPhone平台,但是uLua的代码没有排除Editor环境,DllImport错误造成的。
(10)一个是DLL没有找到的问题(DllNotFoundException: ulua),目前得到的结论是,真机没有打包libulua.so进包导致,或者模拟器也有些设置不对。打包的时候把libulua.so打包进libs\armeabi-v7a
(11)关于性能评测问题,很多朋友表达出担心,今天唠叨两句,本身lua就是解释型语言,效率不高,如果非要追求那种跟C++那样极致的编译效率是不现实的,只能靠开发者自己通过各种注意、技巧接近最高性能。就算是Flash Air以及cos2dx也不可能做到百分百的性能相等。那这种热更新(内更新)的代价与换来的运营上的价值,大家可以自己衡量一下的,还有如果过多担心效率问题的话,推荐核心算法可以放在C#里面完成,lua只做单纯单次调用,我觉得即使lua再慢,ulua再垃圾,单次调用c#的一个函数也不可能会慢到大家吃顿饭的时间吧,高强度循环的东东(各种Update)就不要放在lua里面了,这种可以避免很多不必要的性能忧虑,比如我们的Socket消息,有单个消息通知才会push给lua,这样不会慢到家的,放心!更详细的请参考同学帖子
(12)ulua只能适用于PRO版本,免费版没有办法访问原生码。还有就是尽量使用最新的U3D4.3以上+NGUI3.5+版本,最近在做《Q灵三国》的新版更新,计划把活动部分用ulua实现,我们U3D用4.1.2,NGUI用的是2.7,都是老版本的,好多问题,Sharder丢失、强类型Load素材等,因为项目很大,全部升级新版不太简单。新的游戏框架用的U3D4.3以上+NGUI3.5,所以开发起来非常的方便顺利。这个注意的地方,记录一下。
(13)上午完成了《Q灵三国》里面对ulua的限时活动移植工作,在2011年买的HTC G11(单核)手机上测试到现在,总体来说还行,但是的确没有原始版(C#)的流畅。尽量在游戏初始化的时候把所有的lua脚本都初始化好,然后放入一个公共的对象池,游戏进去以后就不要再产生DoString操作了,需要的时候从lua池里面获取早已初始化好的对象,否则性能比较差,体验很糟糕,这个希望大家注意下哈。【经过一天的优化,限时活动的面板弹出(包含Lua逻辑)已经很接近原始性能了,但是还是有些体验差异,不过真的跟ulua关系不大,主要是原来直接从Resource.Load出Prefab,这一次是从AssetBundle文件里载入,性能会有所不同,如果为了缩小更小的差距,可以提前预加载进游戏,但是要管理好内存占用,这是资源管理器的事情】
(13)我觉得哈,反射没有直接在lua里面声明性能来得好,LuaInterface使用的是反射机制,但是有部分反射机制IOS不认可,这也是有些是可以运行的。反射的性能不是最好的,我对cos2dx不是很懂,但是读过一少部分功能lua代码,他就是有些很常用的方法用lua重写了,如果非要用反射实际上是需要付出性能代价的,不是什么都尽量用反射,尽量lua内部能实现的就别用反射,大家慎用吧。
(14)真的是大家群策群力,坛子上的朋友借助ulua开发了flashx利用uLua转成u3d程序的功能,地址:“4.运行unity3d模式可将AS项目轻松转换为u3d项目”从flash转过来的朋友需要学习的话,可以多多参考哈。欢迎更多的网友把自己的框架贴出来,汇总起来。目前很期待同学的quick-unity框架呢!!!
(15)最近很忙,终于有ulua功能的《Q灵》1.4.0版本提审了,有兴趣的可以试一下,目前有2个地方使用了ulua,一个是“活动”-》“限时活动”里面所有的面板程序都是ulua完成的,包括接收消息等,面板打包资源等。第二个地方没有具体的表现,当进入主场景的时候,ulua会得到一次执行机会,有可能新版活动提示啊,会做相应的提示信息。有问题告诉我一声哈。多谢!!
苹果版: & & 安卓版:
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('/forum/attachment/1404/thread/2_725_cc198b259a22b53.jpg');" />
本部分内容设定了隐藏,需要回复后才能看到
[jarjin于 10:39编辑了帖子]
共2条评分,
不知效率如何
有空的研究下看看
最新喜欢:
我的微博:/jarjin
手游《Q灵三国》技术总监
鲜花3648朵
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 18:11
好啊,谢谢贡献。
请支持我,让Unity圣典做的更好。
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 18:54
学习学习!!!
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 20:32
kankan......................................................
有事秘书干,没事干秘书
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 21:48
看着怎么像是广告啊。。。
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 21:48
不错的,了解下
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 22:58
不错的,了解下
鲜花1101朵
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 23:55
看下,我也试试去
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 09:39
什么情况/?
鲜花1785朵
<span class="lou J_floor_copy" title="复制此楼地址"
data-hash="read_楼#
发布于: 10:43
给力啊!楼主~
您需要登录后才可以回帖,&或者&
Powered by13267人阅读
前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈。
本文测试环境:
系统:WINDOWS 7(第3、6步)、OS X 10.9(第4步)
软件:VS 2012(第3、6步)、Eclipse(第5、6步)
硬件:iPad 2(第4步)、Macbook Pro Mid 2012(第4步)
文章目录:
1、关于Protobuf的C#实现
2、为什么有些Protobuf发布到iOS就用不了,甚至有些在PC都用不了?
3、手动处理C#版本的Protobuf
& & 3.1、创建一个C#工程,先手动创建每一个要通过Protobuf序列化或反序列化的数据模型类,然后导出dll
& & 3.2、创建一个用于序列化的C#工程,然后运行生成dll
& & 3.3、将上面两个工程生成的dll拖到unity中
4、在Unity中反序列化Protobuf
5、服务端Java也用Protobuf
6、太烦了?!客户端也要自动处理Protobuf
1、关于Protobuf的C#实现
首先,U3D里面Protobuf使用的是C#的实现,那么目前有几个可选的C#实现:
C#: /p/protobuf-csharp-port
C#: /p/protosharp/
C#: /protobuf/
C#/.NET/WCF/VB: /p/protobuf-net/
我这里选用的是/p/protobuf-net/(你可以在&这里下载到他的代码和工具),它比较好的一点是,提供了各种平台的支持,解压后在“Full”目录中可以看到各个平台的支持。(现在google被各种封杀,如果你打不开上面的地址,可以下载我上传到CSDN的,里面的csharp文件夹就是各个平台的protobuf需要的dll,点击下载)。
看到里面的unity了吗,它里面的protobuf-net.dll将是我们准备用到的。
2、为什么有些Protobuf发布到iOS就用不了,甚至有些在PC都用不了?
a、Protobuf使用了JIT,即在运行时动态编译,而这个特性在Unity发布到iOS时候是不支持的。因此,会导致你在PC上可以正常运行,发布到iOS就有问题。
b、Protobuf是基于.net 2.0以上框架写的,而Unity仅支持.net 2.0,或者有些使用2.0中比较多的特性,而你在Unity中发布设置了.net 2.0的子集。后者你只需要在Player setting中修改设置就可以了。
上面两项也可适用于其它第三方类库,如果你自己下载了一个在PC上或C#里面能正常使用的类库,在U3D里面就不能用了,那么请检查是否是上面两条原因导致的。
3、手动处理C#版本的Protobuf
知道了上面问题,我们只要选一个.net2.0的Protobuf,然后它又不是JIT,那就可以正常使用了。
这里用的思路是:
& & 3.1、创建一个C#工程,先手动创建每一个要通过Protobuf序列化或反序列化的数据模型类,然后导出dll
& & & & 以VS为例,首先,创建一个类库工程:“文件”&&新建&&&项目&&&类库&(记得选择 .net framework 2.0)
将unity的protobuf的dll添加到项目引用
然后假设你有一个类WorkerInfo是需要通过Protobuf进行序列化和反序列化的,那么创建一个WorkerInfo类,内容如下:
using System.Collections.G
using System.T
using ProtoB
namespace Com.YourCompany.Project.Proto.Module{
&#160; &#160; [ProtoContract]
&#160; &#160; public class WorkerInfo {&#160;
&#160; &#160; &#160; &#160; [ProtoMember(1)]
&#160; &#160; &#160; &#160; public int workerId;
&#160; &#160; &#160; &#160; [ProtoMember(2)]
&#160; &#160; &#160; &#160; public int leftClosingTimeS
&#160; &#160; &#160; &#160; [ProtoMember(3)]
&#160; &#160; &#160; &#160; public int buildingId;
&#160; &#160; }
}按下Shift&#43;F6生成dll,在项目的bin\Debug目录下就可以找到ProtoModelDLL.dll了
& & 3.2、创建一个用于序列化的C#工程,然后运行生成dll
& & & & 也是以VS为例,首先创建一个控制台应用程序:“文件”&&新建&&&项目&&&控制台应用程序&(记得选择 .net framework 2.0)
将Protobuf和3.1生成的dll添加到引用
在项目生成的Program.cs中写入:
using System.Collections.G
using System.T
using ProtoBuf.M
using ProtoB
using Com.YourCompany.Project.Proto.M
namespace ProtoModelSerializerCreator
class Program
static void Main(string[] args)
var model = TypeModel.Create();
model.Add(typeof(object), true);
model.Add(typeof(WorkerInfo), true);
model.AllowParseableTypes =
model.AutoAddMissingTypes =
pile(&ProtoModelSerializer&, &ProtoModelSerializer.dll&);
然后ctrl&#43;F5运行,这时候你就可以在bin\Debug中看到ProtoModelSerializer.dll。
& & 3.3、将上面两个工程生成的dll(ProtoModelDLL.dll和ProtoModelSerializer.dll)以及protobuf-net.dll拖到unity中
& & & & 怎么用?看第4步
4、在Unity中反序列化Protobuf
由于一般游戏客户端请求的数据量比较简单,也比较少,因此我们前端请求是不直接二进制请求。而前端收到后端返回才采用了Protobuf,因此。这里只讨论Protobuf的反序列化。
代码很简单,下面写个测试代码:
using UnityE
using System.C
using ProtoBuf.M
using Com.YourCompany.Project.Proto.M
using System.IO;
using Com.Duoyu001.Proto.B
using Com.Duoyu001.Proto.W
public class TestProto : MonoBehaviour
void Start ()
byte[] dataFromServ = new byte[]{8, 233, 7, 16, 100, 24, 1}; //these bytes are generated by server
RuntimeTypeModel serializer = ProtoModelSerializer.Create ();
System.IO.MemoryStream memStream = new System.IO.MemoryStream ();
WorkerInfo w = new WorkerInfo ();
serializer.Deserialize (memStream, w, w.GetType ()); //asign value to proto model
Debug.Log (w.workerId + &, & + w.buildingId + &, & + w.leftClosingTimeSec);
运行后Unity控制台输出了worker的信息。代码中的dataFromServ字节数组的内容实际应该是通信时候后端返回的。这里测试就不涉及Socket通信的知识了。
5、服务端Java也用Protobuf
看到一个客户端用Protobuf这么麻烦,那后端会怎样呢?其实后端是比较简单的,有Google官方的支持。
下完解压是这样的(2.5.0):
进入“protobuf-2.5.0\java”文件夹,里面是一个maven项目,你直接用maven clean install在target目录就会生成一个protobuf-java-2.5.0.jar的jar包了,没maven的在这里下载吧,我用maven生成的。这个要时候导入你的Java项目。就可以了。
然后你写一个proto文件,调用“protobuf-2.5.0\src”里面的protoc.exe进行生成,它会帮你生成一个java文件。(详细看),我这里有提供一个bat,用于调用protoc来生成java文件的,手动输入的话太麻烦了。在windows下把它保存到.bat然后双击运行就可以了。
echo ** setting runtime variable
REM _protoSrc 是你的proto文件目录的位置
set _protoSrc=F:\project_proto_src\trunk\xgame-controllers\protos
REM protoExe 是用于从proto生成java的protoc.exe程序的位置
set protoExe=C:\Users\john\Desktop\protobuf-2.5.0\src\protoc.exe
REM java_out_file 存放生成的Java文件目录的位置
set java_out_file=F:\project_proto_src\trunk\xgame-controllers\src\main\java\
for /R &%_protoSrc%& %%i in (*) do (
set filename=%%~nxi
if &%%~xi&
== &.proto& (
%protoExe% --proto_path=%_protoSrc% --java_out=%java_out_file% %%i
OK啦,这样你只要把生成的Java复制到或直接生成到你的Java项目源码目录中,然后就可以使用了。比如:
以前面说的WorkerInfo为例
package com.duoyu001.
import java.util.A
import com.duoyu001.xgame.worker.proto.WorkerInfoBuilder.WorkerI
public class TestProto {
public static void main(String[] args) {
WorkerInfo w = WorkerInfo.newBuilder().setBuildingId(1)
.setLeftClosingTimeSec(100).setWorkerId(1001).build();
byte[] byteArray = w.toByteArray();
System.out.println(Arrays.toString(byteArray));
控制台就会输出:
细心的同学会发现这里的字节和上面的“8, 233, 7, 16, 100, 24, 1”有点不太一样。第二个数字分别为-23和233.
其实,这个只是byte的有无符号的表示差异而已。
他们的二进制表示都是:
6、太烦了?!客户端也要自动处理Protobuf
我们看到客户端没加一个类,都需要在两个VS项目中增加代码,而后端是直接根据proto文件生成代码的。这样,好像有点不公平,而且这样前后端还是可能会写出不一样的结构。其实用protobuf我个人觉得最大的好处:
& & a、数据量小
& & b、通过proto模板生成代码,减少前后端联调
但是现在只是后端减少了工作,前端并没有减少,因此第二个好处不是很明显。
那好吧。我没有就这样满足。因此,我决定,前端也要根据proto来生成cs文件。
因此,我使用Java编写了一个解析Proto文件的工具,并且根据proto生成cs文件,然后用bat调用vs的命令行执行vs项目的构建,最后生成两个dll。
我把上面的命令都整合到一个bat中,因此这个bat的任务是:
执行java程序,把proto文件生成cs文件。
调用vs接口构建两个vs项目,生成两个dll。
通过svn把这两个dll提交到客户端的主干上。
调用上面根据proto生成java的bat片段,生成java代码。
通过svn把生成的java代码提交到服务端主干上。
因此,这样一来,现在只要编写好proto文件,然后双击bat,前后端就都可以通过更新svn来获取最新的Protobuf数据对象。
根据proto生成cs文件并编译执行两个vs项目,然后把生成的dll提交到svn上
生成java代码并提交svn
这一步相关操作大家有兴趣可以自行试试,有问题欢迎在本博客讨论。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:310277次
积分:4627
积分:4627
排名:第2780名
原创:77篇
译文:38篇
评论:358条
有意向投资或合作手游开发的,可以联系本人:QQ
喜欢火影、喜欢Java、喜欢Unity3D、喜欢游戏开发的都可以加入木叶村Q群:
(1)(3)(3)(2)(2)(1)(2)(7)(10)(3)(12)(3)(1)(1)(3)(3)(2)(1)(1)(2)(4)(2)(1)(2)(2)(13)(19)(2)(3)(8)}

我要回帖

更多关于 unity3d导入fbx 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信