网站怎么做长截图,注册小程序账号,南通设计网站建设,西安公司网站如何建设【前言】
自动构建是指整个构建流程不需要人工操作#xff0c;只需要输入启动构建指令即可获取构建结果。实现这样的自动构建需要满足以下条件#xff1a;
支持命令行参数启动 我们不可能每次构建时都打开Unity去手动点击构建#xff0c;必须支持通过命令行启动Unity自动执…【前言】
自动构建是指整个构建流程不需要人工操作只需要输入启动构建指令即可获取构建结果。实现这样的自动构建需要满足以下条件
支持命令行参数启动 我们不可能每次构建时都打开Unity去手动点击构建必须支持通过命令行启动Unity自动执行构建我们每次构建的需求不同可能构建Debug、Release或者其他特殊需求的应用因此Unity需要支持识别命令行输入的不同参数支持工程自动检查 我们构建时需要保证不会出现错误否则中途就构建失败了。错误主要来自于代码和资源需要在其被提交到主干时就进行自动检查而不是留在构建时出现构建失败才发现某处代码或资源不对这是提高构建效率的措施自动检查可以提前发现潜在并帮助解决潜在的问题减少问题影响域使得进入游戏包体的问题减少进而降低人力成本支持应用程序自动构建 在Unity中主要是支持iOS自动构建有两步一是自动修改xcode工程二是xcode工程自动执行构建支持构建结果自动上传
【命令行参数启动程序】
我们通常通过点击程序的快捷方式启动程序而所有程序都可能通过命令行来启动两者都是调用更底层提供的接口就好像我们写代码提供一个接口供上层在不同地方调用一样。
以win平台为例输入exe文件的路径即可启动程序例如启动QQC:\Program Files\Tencent\QQ\bin\QQ.exe。
我们知道main函数是程序的入口会接受参数输入我们可以在命令行中输入参数输入的参数被传递给main函数的args程序应该读取这些参数并做相应的处理。参数具体是什么由应用程序来定。
命令行输入参数的语法为 -参数名 参数值
不同参数之前没有先后顺序。
Unity提供了命令行参数说明常用的如下
启动工程 Unity程序路径 -projectPath Unity工程路径启动工程后执行某个函数 Unity程序路径 -projectPath Unity工程路径 -executeMethod NamespaceName.ClassName.MethodName该函数必须是静态函数且位于Editor文件夹中输出log Unity程序路径 -projectPath Unity工程路径 -logfile 输出文件路径执行完命令自动退出 Unity程序路径 -projectPath Unity工程路径 -quit不打开Unity界面执行 Unity程序路径 -projectPath Unity工程路径 -batchmode执行时不使用GPU Unity程序路径 -projectPath Unity工程路径 -nographics设置构建的目标平台 -buildTarget ios-buildTarget android使用CacheServer -EnableCacheServer设置CacheServer端口 -cacheServerEndpoint 127.0.0.1:10080设置使用的图形API -force-gles-force-vulkan-force-d3d12
更进一步的我们不可能每次都手动在命令行输入一堆东西我们需要像点击快捷方式一样直接运行这些指令这时就用到bat脚本。bat脚本可以直接问ChatGPT。
echo off
cd Unity安装目录路径
Unity.exe -projectPath 项目路径 -executeMethod MyScript.MyMethod -batchmode -quit
我们可以在启动Unity时调用我们自己的构建函数即可开始构建。
如果有自定义的参数可以通过System.Environment.GetCommandLineArgs()获取输入的参数并做解析。
【工程自动检查】
检查主要分为代码检查和资源检查可以在每次提交时做一次检查也可以定时做一次全量检查。
代码检查 可以分为编译检查、规范检查和缺陷检查
编译检查做起来做容易可以针对每个人的每次提交做检查主要针对漏提、错提、宏定义等导致的编译不通过情况
规范检查主要是看代码写的符不符合项目规范虽然理论上有这一条但实际上基本不会去做因为每个项目组的规范不一样要做自定义检查而且这个检查也不好做每个人编程习惯有细微差别强制统一很难实施
缺陷检查很困难一般会用第三方库做全量检查
通过检查的代码会被合并到主干进行构建测试这种频繁的将代码变更合并到主干中然后自动构建和测试代码的过程叫做持续集成CI,Continuous Integration
通过检查后合并到主干一般在互联网开发中的做法但在游戏中由于资产较重构建时间很长一般会直接将程序提交的代码合并到主干然后再检查且不会做构建测试
资源检查
凡是游戏内存在的资源例如策划表、UI Prefab、场景Prefab、Timeline、动作资源、Mesh、各种精度模型、音频、各类配置等都需要做检查。
可以做一个Unity全资源自动检查的系统,这些可以定时检查本质上都是命令行启动Unity调用我们的检查方式在不同的检查方法内实现不同的检查
自动通知
在构建或者检查过程中如果出现报错我们会将报错信息输出到Log文件中。但是构建和检查一般是在单独的机器中执行的每次去该机器上找Log文件既繁琐、效率又低因此需要实现自动通知的功能。
将Log文件发送到某个服务器上进行存储同时如果检查出错可以直接将报错信息发送到工作群中的相关人员。
如果办公用的是飞书、钉钉或企业微信其会提供API让我们去实现自动发消息。
【自动修改xcode工程】
使用Unity提供的PBXProject类可以在代码中修改xcode工程的配置示例如下 public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{string projPath path /Unity-iPhone.xcodeproj/project.pbxproj;PBXProject proj new PBXProject();//创建PBXProject对象proj.ReadFromFile(projPath);//获取Targetstring target proj.TargetGuidByName(Unity-iPhone);//设置自动签名proj.SetBuildProperty(target, CODE_SIGN_IDENTITY, Apple Development);proj.SetBuildProperty(target, CODE_SIGN_STYLE, Automatic);proj.SetTeamId(target, teamId); //teamId 是对应开发者正好的团队id (在苹果后台可以看到)//添加系统的FrameWorkproj.AddFrameworkToProject(target, AdSupport.framework, true);proj.AddFrameworkToProject(target, CoreTelephony.framework, true);proj.AddFrameworkToProject(target, StoreKit.framework, true); //内购需要 否则 PBXCapabilityType.InAppPurchase会加不上// 设置 BitCodeproj.SetBuildProperty(target, ENABLE_BITCODE, false);// 设置 other link flags -ObjCproj.AddBuildProperty (target, OTHER_LDFLAGS, -ObjC);// 添加系统的tbd库string filePath proj.AddFile(usr/lib/ lib, Frameworks/ libPath, PBXSourceTree.Sdk);proj.AddFileToBuild(target, filePath);//添加自定义动态库string defaultLocationInProj Application.dataPath/Editor/Plugins/iOS; //framework 存放的路径const string coreFrameworkName boxjing.framework; // framework 的文件名string framework Path.Combine(defaultLocationInProj, coreFrameworkName);string fileGuid proj.AddFile(framework, Frameworks/ coreFrameworkName, PBXSourceTree.Sdk);PBXProjectExtensions.AddFileToEmbedFrameworks(proj, target, fileGuid);proj.SetBuildProperty(target, LD_RUNPATH_SEARCH_PATHS, $(inherited) executable_path/Frameworks);//获取Plist文件string plistPath path /Info.plist;PlistDocument plist new PlistDocument();plist.ReadFromString(File.ReadAllText(plistPath));PlistElementDict infoDict plist.root;infoDict.SetString(CFBundleShortVersionString,version); //versioninfoDict.SetString(CFBundleVersion,build); //build//添加权限描述// 权限 根据自己的项目 修改后面的提示文案infoDict.SetString(NSLocationWhenInUseUsageDescription, 为了发现周围的好友,请允许App访问您的地里位置); //地理位置infoDict.SetString(NSPhotoLibraryUsageDescription, 为了能选择照片进行上传,请允许App访问您的相册); //相册infoDict.SetString(NSMicrophoneUsageDescription, 为了能够录制声音,请允许App访问您的麦克风权限); //麦克风//添加URL Schemes白名单LSApplicationQueriesSchemes是iOS中的一项权限设置用于确定是否允许应用程序通过特定的URL Scheme与其他应用程序进行交互。URL Scheme是一种用于在应用程序之间传递数据和进行通信的方式PlistElementArray list plist.root.CreateArray(LSApplicationQueriesSchemes);lsit.AddString(weixin);//同时添加Key和ValuePlistElementDict dic list.AddDict();dic.SetString(key,value)//获取unityframeworkstring unityFramework proj.GetUnityFrameworkTargetGuid();
}xcode自动构建使用官方提供的xcodebuild这方面的资源很多就不多说了
【构建结果自动上传】
构建的结果不光是应用程序还有Log文件符号表等这些文件都需要自动上传而且上传的地方不一样。日常开发是一个环境发布是另一个环境。
同时还要将构建结果自动在群里通知。
这里只说了应该做哪些事情实现起来都不难就是流程繁琐些。
【定时任务】
python加强
上述用bat脚本实现了自动构建但是后面还有构建结果自动上传、自动通知其他各种繁琐细节的操作等这时候用bat实现就很繁琐我们可以用Phyton脚本实现这些都是简单而固定的逻辑如果不会写可以直接问GPT下面是示例
import subprocess
import timedef Init():print(初始化)def run_unity_method(method_name):unity_path /path/to/Unity # Unity的安装路径project_path /path/to/UnityProject # Unity项目的路径command unity_path -batchmode -projectPath project_path -executeMethod method_namesubprocess.call(command, shellTrue)def xcode_build():print(xcode构建ipa)def upload_build_result():upload_symbol_table()print(其他结果上传)print(上传构建结果)def upload_symbol_table():# 在这里添加上传符号表的代码print(上传符号表)def auto_notify():print(自动通知)def main():Init()run_unity_method(YourNamespace.YourClassName.YourMethod)time.sleep(1) # 等待1秒#如果是ios平台再加上xcode自动构建的xcode_build()#结果上传upload_build_result()#自动通知auto_notify()if __name__ __main__:main()
随后我们只要在命令行中调用Phyton脚本即可
Jenkins加强
实际构建中要输入很多不同的参数而我们的Phyton脚本中各种参数都固定我们不可能在命令行中手动输入参数同时还有一些定时任务等这需要我们有一个可交互界面,可以用Jenkins
在Jenkins中输出参数调用Phyton脚本通过浏览器可以让不同的人都访问到Jenkins。当然Jenkins不止这些功能但在游戏中其他功能用的不多。
到这一步我们就完成了持续交付CD,Continuous Delivery
JenKins使用介绍
【应用自动安装】
应用自动安装启动是比较高级的功能一般大型游戏安装下载耗时都在半小时以上是很耗费时间的可以在日常构建完成后自动安装启动以提高效率。
Android可以用adb指令通过usb或者wifi安装同时做个apk监听新应用安装并发出广播让新应用启动
ios可以使用阿里开源的tidevice
但这两种方式都比较繁琐统一的解决方案是自己开发一个应用模拟人工安装过程
【自助自动构建】
一般自动构建是在特定的机器上进行的如果有人想自己构建验证东西其会花费很长的时间在构建上。可以做一个自助构建的功能让其他人借助已有的自动构建系统进行构建。
原理比较简单先规定一些简单的指令映射自动构建时的参数随后将这些指令转发给Jenkins即可
【参考】
利用Unity提供的PBXObject来自动化iOS工程 - 简书