【小松教你手游开发】【unity实用技能】unity发包优化(android一键发包)
2016-11-18 12:28
781 查看
unity本身的发包其实还是挺方便的,国外的游戏基本都用unity本身的发包。
但在国内的游戏有这么多渠道,这个迭代的速度的情况下,就需要一套更高效的发包方式。
接下来讲具体步骤,如果你们项目有热更新会更麻烦一点。
发包优化的目标是做到一键发包,一般发包机会是一台独立的机子,所以
第一步,更新svn
第二步,配置打包信息。根据不同渠道接入不同sdk
第三步,build apk。
因为我们项目暂时还是测试,所以还没做根据不同渠道接入不同sdk。具体思路是写个xml,在上面填写各种配置信息,版本号,接入sdk名字等。这个会在之后项目做到后面补上
而且我们项目热更新。需要把代码打成dll。所以中间会多几个步骤
首先要说明一下,因为热更我们项目需要2个工程,一个解决方案
一个是游戏主工程(所有客户端都在用),一个打包工程(用来打包,只有初始化代码,和编辑器打包代码)。一个把游戏代码打成dll的解决方案
1.更新游戏主工程代码svn
2.copy游戏主工程代码到打dll的解决方案目录下
3.解决方案打dll
4.dll copy到打包工程下。
5.把dll用TextAsset打开并达成AssetBundle包
6.更新打包工程svn
7.配置打包信息。根据不同渠道接入不同sdk
8.build apk
接下来是具体实现。
因为是一键打包,所有上面所有步骤都需要可以用代码调用。所以外面操作都用.bat执行文件操作
1.更新svn
首先写更新svn的.bat代码
调用.bat文件的代码
2.copy游戏主工程代码到打dll的解决方案目录下
这个就是copy,没什么要说的。
3.解决方案打dll
这里也要用.bat文件执行,就不用打开vs再build
4.dll copy到打包工程下。
也是copy,没什么好说的
5.dll用TextAsset打开并打成AssetBundle包
这里需要重点解释一下。为什么dll要用TextAsset打开不直接就在之后用dll呢
1.因为要做热更,代码用dll来做,但是dll在游戏中下载后不能放到Plugin目录下,放在StreamingAsset目录下的dll又不能直接用。所以要用反射打开放到内存中
2.反射接口Assembly.Load(byte[] bytes) bytes可以从textAsset.bytes中获取,所以就把dll读取成TextAsset并保存下来成AssetBundle,更新bundle包后用TextAsset打开就能直接用
解释一下流程:
1.把dll复制一份备用
File.Copy(path,toPath,true);
2.加载到内存中准备打包
3.打包AssetBundle
6.更新打包工程svn
跟第一个步骤一样
7.配置打包信息。根据不同渠道接入不同sdk
这里我们还没做,后面会补上
8.build apk
最后添加一个编辑器按钮调用上面这些功能就可以了
但在国内的游戏有这么多渠道,这个迭代的速度的情况下,就需要一套更高效的发包方式。
接下来讲具体步骤,如果你们项目有热更新会更麻烦一点。
发包优化的目标是做到一键发包,一般发包机会是一台独立的机子,所以
第一步,更新svn
第二步,配置打包信息。根据不同渠道接入不同sdk
第三步,build apk。
因为我们项目暂时还是测试,所以还没做根据不同渠道接入不同sdk。具体思路是写个xml,在上面填写各种配置信息,版本号,接入sdk名字等。这个会在之后项目做到后面补上
而且我们项目热更新。需要把代码打成dll。所以中间会多几个步骤
首先要说明一下,因为热更我们项目需要2个工程,一个解决方案
一个是游戏主工程(所有客户端都在用),一个打包工程(用来打包,只有初始化代码,和编辑器打包代码)。一个把游戏代码打成dll的解决方案
1.更新游戏主工程代码svn
2.copy游戏主工程代码到打dll的解决方案目录下
3.解决方案打dll
4.dll copy到打包工程下。
5.把dll用TextAsset打开并达成AssetBundle包
6.更新打包工程svn
7.配置打包信息。根据不同渠道接入不同sdk
8.build apk
接下来是具体实现。
因为是一键打包,所有上面所有步骤都需要可以用代码调用。所以外面操作都用.bat执行文件操作
1.更新svn
首先写更新svn的.bat代码
@echo. ----------开始------------ set SVN="C:\Program Files\TortoiseSVN\bin\TprtoiseProc.exe" %SVN% /command:update /path:"E:\xxx\Scripts" /closeonend:1 @echo. ----------完成------------
调用.bat文件的代码
ProcessStartInfo pInfo = new ProcessStartInfo (fileName,String.Empty);//fileName就是你的.bat文件的绝对路径名 pInfo.UseShellExecute = true; pInfo.CreateNoWindow = true; pInfo.WorkingDirectory = Application.data.Path.Remove(Application.dataPath.LastIndexOf('/')); Process process = Process.Start(pInfo); process.WaitForExit(); process.Close();
2.copy游戏主工程代码到打dll的解决方案目录下
这个就是copy,没什么要说的。
3.解决方案打dll
这里也要用.bat文件执行,就不用打开vs再build
@echo. ----------开始------------ set devenv = "D:\VS2015\common7\IDE\devenv.exe" %devenv% E:\xxxx\GameLib.sln /rebuild @if not %errorlevel% == 0 echo ------失败!!!--- @if not %errorlevel% == 0 pause @if %errorlevel% == 0 echo. -------成功------
4.dll copy到打包工程下。
也是copy,没什么好说的
5.dll用TextAsset打开并打成AssetBundle包
这里需要重点解释一下。为什么dll要用TextAsset打开不直接就在之后用dll呢
1.因为要做热更,代码用dll来做,但是dll在游戏中下载后不能放到Plugin目录下,放在StreamingAsset目录下的dll又不能直接用。所以要用反射打开放到内存中
2.反射接口Assembly.Load(byte[] bytes) bytes可以从textAsset.bytes中获取,所以就把dll读取成TextAsset并保存下来成AssetBundle,更新bundle包后用TextAsset打开就能直接用
解释一下流程:
1.把dll复制一份备用
File.Copy(path,toPath,true);
2.加载到内存中准备打包
AssetDatabase.ImportAsset(toPath); AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); TextAsset temp = AssetDatabase.LoadAssetAtPath(toPath,typeof(TextAsset)) as TextAsset;
3.打包AssetBundle
BuildPipeline.BuildAssetBundle(temp,null,add,BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.DeterministicAssetBundle,target));temp 是步骤2的TextAsset.
6.更新打包工程svn
跟第一个步骤一样
7.配置打包信息。根据不同渠道接入不同sdk
这里我们还没做,后面会补上
8.build apk
//简单的根据时间顺序起包名 string dateStr = ""; string versionCodeStr = ""; string finalStr = ""; string[] scene = {“Assets/main.unity”}; dateStr = System.dateTime.Now.ToString("yyyyMMdd"); ArrayList fileList = new ArrayList(); DirectoryInfo dir = new DirectoryInfo ("E:/xxx/apk");//apk目录 FileInfo[] allFiles = dir.GetFiles(); long currentVersionCode =0; foreach(FileInfo file in allFiles) { string fileName = file.Name.Substring(0,12); if(currentVersionCode < long.Parse(fileName)) currentVersionCode = long.Parse(fileName); } if(currentVersionCode != 0 && currentVersionCode .ToString().Substring(0,8) == dateStr) { currentVersionCode = long.Parse(currentVersionCode .ToString().Substring(8,4)) +1; versionCodeStr = currentVersionCode.ToString("0000"); } else versionCodeStr = "0101"; finalStr =dir + "/" dateStr + verionCodeStr + ".apk"; BuildPipeline.BuildPlayer(scene,finalStr,BuildTarget.Android,BuildOptions.None);
最后添加一个编辑器按钮调用上面这些功能就可以了
相关文章推荐
- 【小松教你手游开发】【unity实用技能】unity发包优化(android一键发包)
- 【小松教你手游开发】【unity实用技能】Unity3D_NGUI_性能优化实践_CPU卡顿
- 【小松教你手游开发】【unity实用技能】一键改变UI字体
- 【小松教你手游开发】【unity实用技能】一键改变UI字体
- 【小松教你手游开发】【unity实用技能】unity安卓游戏优化ETC压缩及Alpha通道处理
- 【小松教你手游开发】【unity实用技能】unity安卓游戏优化ETC压缩及Alpha通道处理
- 【小松教你手游开发】【unity实用技能】Unity3D_NGUI_性能优化实践_CPU卡顿
- 【小松教你手游开发】【unity实用技能】Unity3D中Assetbundle技术使用心得
- 【小松教你手游开发】【unity实用技能】unity 内存调试方法
- 【小松教你手游开发】【unity实用技能】unity ngui wp8上使用动态字体消失或碎片化的问
- 【小松教你手游开发】【unity实用技能】从NGUI的UIScrollview的实现原理延伸到ngui的层次,合并,drawcall生成原理
- 【小松教你手游开发】【unity实用技能】 unity 接WP8 sdk的一些心得
- 【小松教你手游开发】【unity实用技能】拓展函数(给系统代码添加可直接使用的接口)
- 【小松教你手游开发】【unity实用技能】重置scrollpanel
- 【小松教你手游开发】【unity实用技能】Unity项目内存优化大全
- 【小松教你手游开发】【unity实用技能】角色头部跟随镜头旋转
- 【小松教你手游开发】【unity实用技能】InvalidOperationException: out of sync
- 【小松教你手游开发】【unity实用技能】unity游戏移植到WindowsPhone8平台上的一些
- 【小松教你手游开发】【unity实用技能】Unity 代码实现抛体运动
- 【小松教你手游开发】【unity实用技能】unity中的几个延时