一款u3d游戏u3d 打包发布android一般是多少m

查看: 9766|回复: 7
听鬼哥说故事之U3D游戏破解分析
阅读权限20
本帖最后由 听鬼哥说故事 于
17:27 编辑
平时里,我们休息的时候喜欢玩点休闲小游戏,不过对于游戏发烧友来说,玩点好玩的稍微大型的游戏则是最好的乐趣,好,今天我们对一款Unity 3D引擎开发的跑酷游戏进行破解分析,主要修改方式为dll文件的相关处理。游戏名称:死亡航线 Dead Route 开发商:GLU主要分析对象:dll文件的简单追踪函数和修改分析步骤1:寻找关键点打开游戏查看购买过程:点击商店,点击购买东西,会弹出如下提示:
图片1.png (162.54 KB, 下载次数: 9)
14:08 上传
按照我们以前的方法和思路,那么就是寻找这个字符串吧:You have not enough cash
不过效果并不理想噢,在所有xml以及smali文件中都没有发现它,怎么办,怎么办。。分析步骤2:想想弹框方式到这里我们就应该想一想在android开发的中是如何控制弹框的,一般来说主要是在代码中使用Dialog,AlertDialg形式,可以用so文件来调用它的显示,当然,这个字符串也可能是存在于so的文件中了。通过搜索,在几个so文件中也并没有搜到相关内容。就这样放弃,那肯定以后这类游戏就没得搞了,我们继续观察反编译后的文件夹结构
图片2.png (3.13 KB, 下载次数: 9)
14:08 上传
看到红框标注的,这个也只能是通过经验了,了解到这个游戏是Unity 3D引擎开发的游戏,因为这类游戏的assets文件夹下文件格式基本都是这个样子,很固定的。Unity 3D引擎的相关资料,同学们可以自己搜索下自己了解了解,它采用c#的引擎进行开发的,核心代码都在dll文件中,跟win的dll文件基本一致。所以游戏开发中会编写相关c#代码作为控制游戏的基本流程代码。于是猜测,弹框是不是就在dll文件中呢,我们打开assets/bin/Data/Managed文件夹下Assembly-CSharp.dll因为分析过几个此类游戏,核心代码都在这个名称的文件中,那么我们直接操作这个。分析步骤3:通过弹框寻找购买的上下控制流程反编译dll文件有多种方式,经常破解win平台下的软件的朋友会很了解,我在win下的破解很少,所以对于dll的相关操作都是现学的,主要包括反编译,读IL代码,修改。这里,我们使用的工具为:(相关使用方法,自己搜搜学学即可)Reflector.exe 反编译工具Reflexil 分析插件相关东西百度都可以找到,这里就不再叙述。使用Reflector打开Assembly-CSharp.dll,使用F3进行搜索:
图片3.png (84.35 KB, 下载次数: 9)
14:09 上传
第一行红框,这里分为三种,我们选择最后一个,搜索字符串和内容。我们发现下面有两个地方调用它,好,这样就达到了我们的预期效果了。双击一个进入:
图片4.png (50.55 KB, 下载次数: 8)
14:09 上传
C#代码,简单上来说会java基本能看懂点。这里按照c#的方式来讲,这个方法的效果通过名称可以猜到是创建金币不足的对话框,方法里面是创建对话框的内容。这里就需要分析它的调用了,看是被谁调用,就是在商店购买那里产生的。于是,右击Analyze:
图片5.png (248.82 KB, 下载次数: 9)
14:10 上传
然后发现:
图片6.png (8.27 KB, 下载次数: 7)
14:10 上传
选择第一个,右击,goto Member打开对一个的类,发现:
图片7.png (2.85 KB, 下载次数: 8)
14:10 上传
到了这里,我们就明白了,这里是判断道具的金币数量与我们自己的金币数量做比较,如果道具的价钱大于我们的价钱,那么肯定要弹出我们的金币不足。在这里,我们就知道App.account.money.coins就是我们的金币数量,刚好游戏中氛围金币和银币,这里两个数据正好省的我们继续分析另一个的银币位置的时间了。一步一步追踪看看coins是在哪里定义:到App.account.money看到money这里了,发现:
图片8.png (899 Bytes, 下载次数: 5)
14:11 上传
打开A(),我们会发现:
图片9.png (984 Bytes, 下载次数: 5)
14:11 上传
好了,貌似形式非常明朗了。。。我们找Money这个model,看看它里面是什么东西,这里来看,肯定是coins,cash的对象,也就是金币银币的。
图片10.png (11.47 KB, 下载次数: 5)
14:11 上传
我们这时候需要简单分析这个里面的每一个方法了到第三个共有方法Money(int cash,int coins),,我们发现如下代码:
图片11.png (5.48 KB, 下载次数: 5)
14:12 上传
这里的a()跟Money里面的pirvate a()是同一个,打开它:
图片12.png (6.37 KB, 下载次数: 5)
14:12 上传
嗯,Eu和Ev的数值,我们刚才通过查看Money类的整体代码,大致明白一个代码coins一个代表cash,所以,我们这里修改this.Eu=&&,this.EV=9999999这样,Money(int coins,int cash),在被调用的时候,肯定会将金币修改掉了。这样修改以后,怎么才能调用呢?这里跟0比较,那么我们就直接到商店里面的升级upgrade选项,升级东西,一升级肯定得先扣钱,同时有上面的分析过程得知,这里是会调用的。所以,我们可以先修改一下试试看效果:开始修改:首先打开我们安装好的Reflexil插件:
图片13.png (10.69 KB, 下载次数: 5)
14:12 上传
修改过程如下:
图片14.png (167.64 KB, 下载次数: 5)
14:13 上传
第1行:从栈顶取实例指针,并入栈第2行:ldc.i4.0是载入0第3行:bge.s是bge的短指令格式&value1&大于等于&value2&跳(注释::一般代码中,都是反着写,因为有自己的逻辑跳到下面的)第4行:ldarg.0,载入第0个参数并入栈第5行:这个是咱们修改的,常数9999999第6行:从栈中取出待存储数据和实例指针,存到Money.Eu里面好了,这些代码大致就是这些意思,不懂的同学,请搜索:[微软.NET程序的加密与解密].pdf,看雪的这本书籍。一定要好好读读。。。好了,修改完毕后,我们就要开始保存:到这里以后,我们查看左边的文件结构,我们现在操作的已经是drcore.dll这个文件了。反编译工具会自动识别相关文件夹下的其他dll的,所以我们按照如下图方式操作保存,重命名,替换掉:
图片15.png (165.87 KB, 下载次数: 5)
14:13 上传
开始测试:替换掉对应的dll文件以后,我们直接回编译,安装。跳过tips,然后进入shop,选择枪,Upgrade升级用金币升级看看:再用银币升级看看:
图片16.png (214.34 KB, 下载次数: 5)
14:14 上传
好了,达到我们的预期效果。。。那就暂时告一段落。。。
排版看着不舒服的,直接看文档吧。。。
链接:/s/1c09wvQC 密码:0dae
建议大家读一读刚才推荐的书籍:[微软.NET程序的加密与解密].pdf
我也是新手,在学习中......
爱生活,爱鬼哥.....
欢迎小妹妹们学习交流.....
咳咳,不能邪恶了.....
听鬼哥说故事6.20
我很赞同!
鼓励转贴优秀软件安全工具和文档!
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
谢谢鬼哥的教程 又学习了
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限25
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
支持楼主分享心得
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
这么好的贴怎么没人顶呢,
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
谢谢鬼哥的教程 又学习了
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
鬼哥,文档有密码
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
支持鬼哥!哈哈来自: Android客户端
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz!
Comsenz Inc.u3d菜鸟入门:游戏中的图集
u3d菜鸟入门:游戏中的图集
写本文的目的
希望那些像我一样想从事游戏开发,但对这些基础知识了解甚少的人做一些简单讲解。在图文并茂、理论与实践结合的讲解之后,让那些不了解的初学者能够明白这些基础的原理(也就是为啥要这么用)以及实际应用
图集,在unity引擎中第一次看到,还是在用NGUI的时候,看到有一个叫做atlas的东东。当时不知道这是何物。网上搜了下,也没能得到太清晰的答案。
百度百科里的解释如下:
1. 图片的集合,如地图集,影集,把图片分门别类装订成册。
2. 图示的集合。如设计图集,按照一定规则编制的规范样本及说明文件的集合。
3. 国家指定的技术科研部门出版的图集,是指导规范各种专业实体,具有鉴定与约束效力的法规性质的技术文件。
乍一看上面的解释,很难对游戏里的图集有一个具体的认识吧?
但是如果接触过游戏开发,或者在网上搜过一些游戏的素材包,应该可以看得到一些类似下图的图片
这就是图集,Atlas!
所谓图集,就是图片的集合。上面的图集中,有很多个小的图片单元。它们大小不一,像那把刀的图片,相对来说就大一些;而那些拳头的图片,甚至那些锁链的图片,就小很多。
这里找到一个关于介绍图集的原理的视频,可惜是英文版的,自己没能力将其翻译成中文的,也仅仅是能够听个大致意思。如果英文比较好的同学可以看看这里,相信你对图集会有更全面的认识!这里是视频地址:
上面这个视频如果没看的同学,我这里也只能简单的给大家讲下视频的大致意思,毕竟自己英文水平还不够高,好尴尬,哈哈。。
个人对视频内容的理解是:
例如上面的图集中,里面的每个小图片都是一个图片单元。本来图片单元是各自在不同的图片,甚至是各自单独占据一张图片。那么对于计算机来说,每次为了读取图片中的信息,会将整张图片的信息都独到内存中来。那么,空白的地方虽然没有图片信息,但是也会有空数据来占据内存。所以假如上面的图集是分别存放在不同的图片中,那么计算机为了读取到这些图片,就不得不花费很多的时间和内存来读取和存放这些图片。但是我们可以清楚的看出,每张图片都只占据了那么大的空间,即使是在同一张图集中,仍然也只有那么大。而游戏中要用到的图片何止这么多,做过游戏开发或者研究过游戏素材包的同学应该很清楚,图片那是相当的多。所以为了在游戏运行时减少计算机的消耗,开发人员就发明了图集这样一种神奇的东东!
而图集展示给我们的也很清楚,有这么多图片,但中间仍然有空隙。这个有两部分原因:
1.每个图片单元虽然很小,并且都放在了同一张图集中,但仔细观察会发现,它们和周边的空白部分都可以组成一些有规则的图形(一般来说为了计算机读取方便,都是正方形或者矩形)。例如我们仍然可以用左下角的两个小图片单元为例,仔细观察,应该可以看出它们之间有那么一点点(很小,甚至可能是一像素)的间隙,由于无法完美展现出两者之间的距离,只能用QQ截图的办法来做个示意图,希望大家能理解我的意思:
下图中,图1和图2之间的距离大概也就是这个红线框的宽度吧(目测1像素)。
有同学可能会问了,那计算机是如何读取这些图片单元的呢?也就是这些小图片都在这一张图集中,如何来判断读取的是哪张图片呢?
这个问题问的好!之前做开发的时候,也遇到过这种问题。上图中图1的大小是一个矩形,而矩形可以通过三个数据来保存:起始点,宽度,高度。起始点呢,可以将图片看成是一个2D坐标系,实际上游戏开发过程中也就是将其看作一个2D坐标系,坐标系中是由很多个像素块组成的。因为是像素块是最小单位了,所以该坐标系中只会有整数,木有小数(浮点数)。所以一般来说图1的起始点就是红线框的左上角(也有可能是右下角,根据不同的图像处理引擎或者游戏引擎而定)。宽度和高度就不用再解释了。
这样我们就能告诉计算机,某张图片在图集中的具体位置了。然后我们可以将该图片的信息存放到一个数据结构(比如数组、链表等),或者存放到字典中等,在取用的时候,只需要根据索引或者对应的信息来取想要的图片即可。
2.虽然每张图片单元有自己的大小,但是有一些空白明显是没有任何图片的。这些空白可能的原因:
1)对于每个图集来说,原则上存放的都是相关的图片,比如这个图集中存放的都是某一个怪物的UI或者是某一个界面的UI,而这个界面中只用到了这么多图片,所以一张图集中就会有这些空白。
2)对于相关的图片,可能其尺寸不一样,有的大有的小,有的太大不适合放在一个图集里,只能单独存放为一个图集(比如一些游戏的loading界面),而小的图片则存放同一个图集中。该图集中剩余的位置不够存放其他大图片,因此图集中一般来说都会有空白。
UGUI中图集的应用
说到图集,理论的上面讲了一大堆,也不知道大家明白了没。自己觉着说的还算凑合,有不对的地方,如果大神看到了还请多喷几句。
下面来说下应用吧。
首先来说说UGUI中如何给控件加图片。
1.首先在U3D中创建一个新场景
2.然后随便从网上找了张图片,任何格式的都可以(理论上来说,U3D支持 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT这些格式的图片)。
3.将图片导入u3d中,然后在空场景中添加一个image控件
4.然后将图片拖到image控件上
这时我们发现,图片无法拖上去!这是为何?在往3D物体中拖图片的方法,2D中竟然行不通了!
无奈,在网上搜了下,发现是图片的类型不对。这里我们需要在U3D中修改下图片的类型:
5.在U3D中选中图片,在右侧的inspector界面中可以看到图片的Texture Type,默认其类型为Texture。这里我们将其设为Sprite(2D and UI),然后在下方的Max Size选择合适的大小。然后点击右下角的apply按钮应用设置使图片变成想要的类型。接下来我们就可以把图片拖给2D控件了。
这里我们要讨论的是UGUI的图集使用。所谓图集,就是图片的集合,所以这里就得找两张图片。导入U3D,然后将其设置为Sprite(2D and UI)类型的图片格式,选择之后,可以看到inspector界面里有Packing Tag这一项,该项的意思是图片打包图集的图集顺序。比如你希望第一张图片打包到第一个图集里,第二张图片打包到第二个图集里。那两张图片的tag分别设置为1、2即可。这里为了讨论UGUI的图集使用,将其均设置为1。这里设置完,然后我们需要去系统设置里修改一个UGUI打包图集的选项:
这里我用的是5.0.1f,点击Edit-&Project Setting-&Editor,然后在右侧可以看到Editor的选项,最后一项Sprite Packer,选择Always Enabled即可。之后,在U3D中新建两个图片控件,分别将他们的Source Image设置为前面说的两张图片。设置好后,点击Windows-&Sprite Packer,打开图集打包界面,点击pack按钮,就将图集打包好了,在Sprite Packer界面中可以看到两张图片被打包到同一个图集里了。
这里也只是简单介绍了下UGUI图集的使用。更多详细信息,大家可以参考U3D官网的资料,也可以看这里,一个很权威的大神写的帖子,很详细:
第一次发技术性帖子,感觉写了好多东西,但仔细看来,也没太多深入的东东。而且后面写的东西有点太简单了,还犯懒直接把雨松大神的文章传送门给出来。。一方面感觉自己研究的还少,另一方面,雨松大神写的确实很到位,大家看这里应该会有不少收获。好吧,先到这里了。
PS:在Unity5.0之后,stat 里显示的draw call被修改为SetPass calls,其实都是一回事。
我的热门文章
即使是一小步也想与你分享程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之IOS全自动打包生成ipa(六十八)
Unity3D研究院之IOS全自动打包生成ipa(六十八)
围观63085次
编辑日期: 字体:
接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿。。 建议大家先看一下上一篇文章。
首先我们要先搞清楚nity全自动打包的重要步骤。
1.自动生成xcode工程。
2.自动生成.ipa和dsym文件。
3.上传appstore(本篇略)
首先我们在做渠道包时,一般每个渠道都有自己一些特殊的需求,比如 游戏名子 、游戏图标、SDK、等等。那么我在在做自动化打包的工具时,需要把渠道作为参数传入shell脚本中,如下图所示开始运行我的shell脚本,这里只接收一个参数,其实就是告诉脚本你要打什么渠道的包,这里我写91。
脚本比较简单,原理就是先生成xcode工程,然后接着生成.ipa 。 代码中的$1 就表示我传入的第一个参数 91字符串。
UNITY_PATH :就是unity安装的路径, 如果你不改Unity的名子Mac上就会是这个路径。
PEOJECT_PATH:这个是你游戏工程的路径。。就是 Assets/上一级的哪个路径。。
BUILD_IOS_PATH:这个是我打包生成ipa的一个脚本,后面我会细说我目前把这个脚本放在我的游戏工程里, 所以他是一个相对路径。
XCODE_PATH:这个是生成xcode工程的路径,因为可能有很多渠道,所以我就传入的91字符串作为文件名。
1234567891011121314151617181920212223242526272829
#!/bin/sh&#参数判断&&if [ $# != 1 ];then&&&&&&echo "需要一个参数。 参数是游戏包的名子"&&&&&&exit&&&& fi&&&#UNITY程序的路径#UNITY_PATH=/Applications/Unity/Unity.app/Contents/MacOS/Unity&#游戏程序路径#PROJECT_PATH=/Users/MOMO/commond&#IOS打包脚本路径#BUILD_IOS_PATH=${PROJECT_PATH}/Assets/buildios.sh&#生成的Xcode工程路径#XCODE_PATH=${PROJECT_PATH}/$1&#将unity导出成xcode工程#$UNITY_PATH -projectPath $PROJECT_PATH -executeMethod ProjectBuild.BuildForIPhone project-$1 -quit&echo "XCODE工程生成完毕"&#开始生成ipa#$BUILD_IOS_PATH $PROJECT_PATH/$1 $1&echo "ipa生成完毕"
脚本执行的过程,无需打开unity工程,它会自动打开unity工程,自动构建xcode工程,自动关闭unity工程,然后自动打包。。如下图所示,看到这样的字样你的IPA就生成完毕了。
然后你的.ipa和dsym文件就安安静静的放在build文件夹下,项目根目录/91/build文件夹下面,dsym文件也放在下面,如果你的渠道包比较多的话,你可以把它们统一移动到一个文件夹下面。还有dsym一定要打出来,因为只有dsym 和 .crash文件才能解析出 c#代码中哪个调用方法出的错, 以后有时间了我会整理以下dsym和.crash文件怎么解析出c#错误的堆栈来。。
ipa是出来了, 不过我们还是要看看它到底是怎么出来了。。在shell脚本中我调用了
$UNITY_PATH -projectPath $PROJECT_PATH -executeMethod ProjectBuild.BuildForIPhone project-$1 -quit
它的意思就是自动打开unity,然后打开你的游戏工程,然后调用ProjectBuild类中的BuildForIPhone的这个方法,然后关闭unity。ProjectBuild类是我自己写的,大家也可以定制自己的类 和方法,static的就可以。
这里有个比较重要的参数 project-$1 这个参数就是外面我们传进来的 91 字符串。 这个字符串很重要,因为工程里面构建的时候需要根据不同的渠道打包不同的资源 包名 文件名 等等。我们在看看 ProjectBuild.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
using System.Collections;using System.IO;using UnityEditor;using UnityEngine;using System.Collections.Generic;using System;&class ProjectBuild : Editor{& //在这里找出你当前工程所有的场景文件,假设你只想把部分的scene文件打包 那么这里可以写你的条件判断 总之返回一个字符串数组。 static string[] GetBuildScenes() {
List&string& names = new List&string&();&
foreach(EditorBuildSettingsScene e in EditorBuildSettings.scenes)
if(e==null)
if(e.enabled)
names.Add(e.path);
return names.ToArray(); }&&&&&//得到项目的名称 public static string projectName {
//在这里分析shell传入的参数, 还记得上面我们说的哪个 project-$1 这个参数吗?
//这里遍历所有参数,找到 project开头的参数, 然后把-符号 后面的字符串返回,
&&&&//这个字符串就是 91 了。。
foreach(string arg in System.Environment.GetCommandLineArgs()) {
if(arg.StartsWith("project"))
return arg.Split("-"[0])[1];
return "test";
} } //shell脚本直接调用这个静态方法 static void BuildForIPhone() { &&&&&&&&//打包之前先设置一下 预定义标签, 我建议大家最好 做一些&&91 同步推 快用 PP助手一类的标签。 这样在代码中可以灵活的开启 或者关闭 一些代码。&&&&&&&&//因为 这里我是承接 上一篇文章, 我就以sharesdk做例子 ,这样方便大家学习 ,
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iPhone, "USE_SHARE");&&&&&&&&//这里就是构建xcode工程的核心方法了, &&&&&&&&//参数1 需要打包的所有场景&&&&&&&&//参数2 需要打包的名子, 这里取到的就是 shell传进来的字符串 91&&&&&&&&//参数3 打包平台
BuildPipeline.BuildPlayer(GetBuildScenes(), projectName, BuildTarget.iPhone, BuildOptions.None); }}
你可以在打包之前 去修改projectSetting的参数, 比如 包名 游戏名 icon 等等 /Manual/class-PlayerSettings.html
OK shell脚本中就直接开始构建你的xcode工程。还记得上一篇文章我提到的XUPorter吗?它的原理就是当Xcode打完完毕后开始动态的编辑 framework plist oc代码。。 我们在回到XUPorter XCodePostProcess.cs这个类里面, 如果没看过我上一篇文章的 我建议看一下。。
下面的代码 上一篇文章我已经介绍的很清楚了, 这里就不赘述了。主要看 54行 – 64行之间的代码。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
using UnityEngine;&#if UNITY_EDITORusing UnityEditor;using UnityEditor.Callbacks;using UnityEditor.XCodeEditor;using System.Xml;#endifusing System.IO;&public static class XCodePostProcess{&&&&#if UNITY_EDITOR&&&&[PostProcessBuild (100)]&&&&public static void OnPostProcessBuild (BuildTarget target, string pathToBuiltProject)&&&&{&&&&&&&&if (target != BuildTarget.iPhone) {&&&&&&&&&&&&Debug.LogWarning ("Target is not iPhone. XCodePostProcess will not run");&&&&&&&&&&&&return;&&&&&&&&}&&&&&&&&&//得到xcode工程的路径&&&&&&&&string path = Path.GetFullPath (pathToBuiltProject);&&&&&&&&&// Create a new project object from build target&&&&&&&&XCProject project = new XCProject (pathToBuiltProject);&&&&&&&&&// Find and run through all projmods files to patch the project.&&&&&&&&// Please pay attention that ALL projmods files in your project folder will be excuted!&&&&&&&&//在这里面把frameworks添加在你的xcode工程里面&&&&&&&&string[] files = Directory.GetFiles (Application.dataPath, "*.projmods", SearchOption.AllDirectories);&&&&&&&&foreach (string file in files) {&&&&&&&&&&&&project.ApplyMod (file);&&&&&&&&}&&&&&&&&&//增加一个编译标记。。没有的话sharesdk会报错。。&&&&&&&&project.AddOtherLinkerFlags("-licucore");&&&&&&&&&//设置签名的证书, 第二个参数 你可以设置成你的证书
project.overwriteBuildSetting ("CODE_SIGN_IDENTITY", "iPhone Developer: Yu Song (XXXXXXXXXX)", "Release");
project.overwriteBuildSetting ("CODE_SIGN_IDENTITY", "iPhone Developer: Yu Song (XXXXXXXXXX)", "Debug");&&&&&&&&&// 编辑plist 文件&&&&&&&&EditorPlist(path);&&&&&&&&&//编辑代码文件&&&&&&&&EditorCode(path);&&&&&&&&&// Finally save the xcode project&&&&&&&&project.Save ();&&&&&&&&&//上面的介绍 我已经在上一篇文章里面讲过, 这里就不赘述 。。&&&&&&&&//那么当我们打完包以后 如果需要根据不同平台 替换 不同的framework plist oc 包名 等等。。。&&&&&&&&&//这里输出的projectName 就是 91&&
Debug.Log(projectName);&&&&&&&&&if(projectName== "91")&&&&&&&&{&&&&&&&&&&&& //当我们在打91包的时候 这里面做一些 操作。&&&&&&&&&}&&&&&}& public static string projectName {
foreach(string arg in System.Environment.GetCommandLineArgs()) {
if(arg.StartsWith("project"))
return arg.Split("-"[0])[1];
return "test";
} }&&&&private static void EditorPlist(string filePath)&&&&{&&&&&&&&&XCPlist list =new XCPlist(filePath);
string bundle = "com.yusong.momo";&&&&&&&&&string PlistAdd = @"&&&&&&&&&&&&&&&key&CFBundleURLTypes&/key&&&&&&&&&&&&&&array&&&&&&&&&&&&&&dict&&&&&&&&&&&&&&key&CFBundleTypeRole&/key&&&&&&&&&&&&&&string&Editor&/string&&&&&&&&&&&&&&key&CFBundleURLIconFile&/key&&&&&&&&&&&&&&string&Icon@2x&/string&&&&&&&&&&&&&&key&CFBundleURLName&/key&&&&&&&&&&&&&&string&"+bundle+@"&/string&&&&&&&&&&&&&&key&CFBundleURLSchemes&/key&&&&&&&&&&&&&&array&&&&&&&&&&&&&&string&ww123456&/string&&&&&&&&&&&&&&/array&&&&&&&&&&&&&&/dict&&&&&&&&&&&&&&/array&";&&&&&&&&&//在plist里面增加一行&&&&&&&&list.AddKey(PlistAdd);&&&&&&&&//在plist里面替换一行
list.ReplaceKey("&string&com.yusong.${PRODUCT_NAME}&/string&","&string&"+bundle+"&/string&");&&&&&&&&//保存&&&&&&&&list.Save();&&&&&}&&&&&private static void EditorCode(string filePath)&&&&{
//读取UnityAppController.mm文件&&&&&&&&XClass UnityAppController = new XClass(filePath + "/Classes/UnityAppController.mm");&&&&&&&&&//在指定代码后面增加一行代码&&&&&&&&UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"","#import &ShareSDK/ShareSDK.h&");&&&&&&&&&//在指定代码中替换一行&&&&&&&&UnityAppController.Replace("return YES;","return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:nil];");&&&&&&&&&//在指定代码后面增加一行&&&&&&&&UnityAppController.WriteBelow("UnityCleanup();\n}","- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url\r{\r&&&&return [ShareSDK handleOpenURL:url wxDelegate:nil];\r}");&&&&&}&&&&&#endif}
OK 到这一步我们的xcode工程已经做完。。 然后Shell 脚本开始 生成.ipa文件。
#开始生成ipa#
$BUILD_IOS_PATH $PROJECT_PATH/$1 $1
上面代码的意思 就是 去调用我工程里面的buildios.sh文件。 需要传入两个参数 一个是 xcode工程的地址, 一个是 ipa的名子。。。 这个脚本我参考了
这篇文章, 但是 最后生成ipa我没能成功, 自己又修改了一点。。
123456789101112131415161718192021222324252627282930
# #!/bin/bash&&&#参数判断&&if [ $# != 2 ];then&&&&&&echo "Params error!"&&&&&&echo "Need two params: 1.path of project 2.name of ipa file"&&&&&&exit&&elif [ ! -d $1 ];then&&&&&&echo "The first param is not a dictionary."&&&&&&exit&&&&&&&fi&&#工程路径&&project_path=$1&&&#IPA名称&&ipa_name=$2&&&#build文件夹路径&&build_path=${project_path}/build&&&#清理#xcodebuild&&clean&#编译工程&&cd $project_path&&xcodebuild || exit&&&#打包 下面代码我是新加的#&&xcrun -sdk iphoneos PackageApplication -v ${build_path}/*.app -o ${build_path}/${ipa_name}.ipa
OK,到这一步我们的教程就完毕了。。因为工程中涉及到我项目用的证书啊什么的,所以我不能给出来。 所以我把你需要修改的地方列出来。
1.在关闭unity的状态下 运行 build脚本。 直接把build.sh 拖入终端里
加一个你定义的参数
下图是我测试工程的目录结构。
2.在XCodePostProcess.cs 里面 把证书 还有包名 修改成你的。。
3.你的shell脚本需要给它权限
代码很简单
chmod +x build
4.我的工程下载地址:
如果我说的上面三点你都修改完毕, 那么这个代码必然会帮你自动生成.ipa
本篇文章我主要给出一个大概的思路,大家可以在我的思路下去拓展,比如 一键打包多个渠道、 打包完毕后自动上传svn等操作。。
有问题 给我留言吧, 嘿嘿!!!
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!}

我要回帖

更多关于 u3d 打包.unity 的文章

更多推荐

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

点击添加站长微信