Unity构建详解(10)——Unity构建流程

【前言】

我们知道从源代码到可执行文件有四个步骤:预编译、编译、汇编、链接

  • 预编译:处理源代码文件中的以“#”开始的各种预编译指令
  • 编译:通过语法语义分析等将源代码文件转为中间语言文件并进行优化,再生成汇编代码文件
  • 汇编:将汇编代码文件翻译成机器指令格式的二进制文件,即生成目标文件
  • 链接:将多个目标文件链接起来生成可执行文件

Unity本身不会去构建出来一个可执行文件,最终的构建流程还是依托与不同平台的构建工具,Unity的构建相当于为平台构建工具提供数据,这些数据只要是三类:代码文件、资源文件、配置文件。例如,构建出Apk最终还是需要调用Android SDK和NDK,构建出IPA最终还是要在Xcode中进行的。

一般来说,构建会在软件上提供交互入口,点击后开始自动构建,这种方式用的是软件提供的自动构建流程。

我们会有自定义构建处理的需求,在整个构建流程中会提供Hook让我们在代码中去做自定义处理。一般有三种方式:

  • 提前注册
  • 继承接口
  • 使用特性

【Unity构建流程】

构建流程为:准备构建->资源收集->脚本编译->Shader编译->配置文件生成->平台构建

1.发起构建:调用BuildPipeline.BuildPlayer(buildPlayerOptions)发起构建,buildPlayerOptions内容如下:

  • string[] scenes 要构建的场景的路径
  • string locationPathName 输出路径
  • string assetBundleManifestPath
  •  BuildTargetGroup targetGroup
  • BuildTarget target 
  • int subtarget
  • BuildOptions options
  • string[] extraScriptingDefines

2.平台切换:发出回调OnActiveBuildTargetChanged,继承自IActiveBuildTargetChanged。一般来说会事先切换好。

3.准备构建:引擎先调用PrepareForBuild,其继承自BuildPlayerProcessor

在这一步,我们需要事先把需要的资源文件和配置文件准备好。Unity构建时会从Plugins和StreamingAssets文件中收集资源,构建前先将需要放入初始包的资源放入这两个文件夹中。

由于Unity认为文件夹中的所有文件都是需要收集的,这里会存在两个问题:文件夹中的某些资源在打开时不需要,需要的一些资源不在文件夹中。

存在不需要的资源是因为项目管理没做好,需要事先规定并坚持执行:不进包的资源不能放在改文件夹中。否则,出现该问题会导致初始包包体增大。如果已经出现该问题,那么积重难返,需要在构建前删掉不需要的资源。

针对不在资源中的文件夹,需要从其他地方Copy过来,例如有些Bundle要进初始包,但打包出来的Bundle在其他路径,不在StreamingAssets文件夹中;有些插件不在事先放到Plugins文件夹中也要Copy过来。

4.资源收集

5.准备完成:引擎OnPreprocessBuild,继承自IPreprocessBuildWithReport

6.编译脚本:

C#脚本经过C#编译器生成Dll,引擎调用OnPostBuildPlayerScriptDLLs,其继承自IPostBuildPlayerScriptDLLs。一般来说承载游戏逻辑的C#脚本会被编译成Assembly.Csharp.dll,Plugins文件夹中的被编译成Assembly-CSharp-firstpass.dll。可以在编译完成后做自定义处理,但这会拖慢构建速度,一般不处理。

生成Dll后UnityLinker.exe会对代码进行裁剪,裁剪前发出GenerateAdditionalLinkXmlFile,其继承自 IUnityLinkerProcessor。生成自定义的Link.xml文件用于代码剥离,可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度

IL2CPP对剥离后的代码进行编译,生成二进制的代码文件。

7.编译Shader

编译某个Shader前,引擎调用OnProcessShader,其继承自IPreprocessShaders

编译某个ComputeShader 前,引擎调用OnProcessComputeShader,继承自IPreprocessComputeShaders

8.构建完成:调用OnPostprocessBuild,需要继承IPostprocessBuildWithReport。对应的特性为PostProcessBuildAttribute

如果是iOS平台,这时已经生成了XCode工程,通过BuildReport.Summary.OutputPath可以知道工程路径,可以将一些ios的库拷贝到xcode工程中。如果做自动化构建,需要在代码中修改xcode工程的属性和配置。

如果需要导出Android工程,在Android Gradle工程生成后,引擎会调用OnPostGenerateGradleAndroidProject,其继承自IPostGenerateGradleAndroidProject

9.平台构建

构建APK会调用Android SDK 和NDK自动构建

构建IPA需要在Xcode工程中构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘神器:智能私信破局获客难!

在数字营销的海洋中,每个企业都如同一艘努力航行的船,希望能在广阔的客户蓝海中获得丰收。然而,现实却往往充满挑战,尤其是当面对如何吸引并维系客户这一核心难题时。传统的获客手段逐渐显得力不从心,而智能科技的介入…

OpenHarmony语言基础类库【@ohos.util.Deque (线性容器Deque)】

Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。 Deque和[Queue]()相比,Queue的特…

Postman获取接口返回值设置为变量

//设置环境变量,提取token // 把responseBody转为json字符串 var jsonData JSON.parse(responseBody); // 设置环境变量,提取token pm.environment.set("Authorization", jsonData.token_type " " jsonData.access_token); //设…

如何分析和优化慢sql语句

前言 sql查询速度比较慢容易成为性能瓶颈,这时我们可以优化我们的sql语句或数据库表 一般sql语句执行很慢的种类分为: 1.聚合查询 2.多表查询 3.表数据量过大查询 4.深度分页查询 这四种的前三种都可以通过优化sql语句来优化sql查询速度 正文 聚合查询 我们可以通过尝…

洗地机什么牌子比较好?4款洗地机品牌型号深度推荐

随着科技的不断发展,清洁工具也在不断进化。手持洗地机作为一种新型的清洁工具,因其便捷、高效的特点受到了消费者的青睐。然而,市场上的洗地机品牌众多,消费者在选择时常常感到困惑。那么,哪些洗地机品牌在口碑上表现…

FinalShell 安装 及使用教程

一 简介: FinalShell 是一款免费的国产的集 SSH 工具、服务器管理、远程桌面加速的良心软件,同时支持 Windows,macOS,Linux,它不单单是一个 SSH 工具,完整的说法应该叫一体化的的服务器,网络管理软件,在很…

记录一个Maxwell采集MySQL数据时报安全证书时间不通过的问题

【背景描述】 我的zk,kafka和Maxwell都正常启动了 此时我需要用Maxwell将MySQL的一张表user_info将其全量同步到kafka当中时发生报错,命令如下: [atguiguhadoop102 datas]$ /opt/module/maxwell/bin/maxwell-bootstrap --database gmall --…

3、Flink执行模式(流/批)详解(上)

0、批模式和流模式对比表 类别流模式批模式任务调度所有任务需要持续运行,消耗资源大任务可以按Shuffle分阶段执行,消耗资源小Shuffle记录会被流水线式的持续发送到下游任务,在网络上进行缓冲可以保存Shuffle分阶段执行的中间结果State Back…

Linux的UDEV机制

udev 机制引入: 手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb c. dmeg能查看到手机接入的信息,但是输入adb devices会出现提醒 dinsufficient permissions for …

Instagram运营5大技巧,防封攻略

对于企业和个人而言,运营Instagram已成为吸引流量、增加曝光、提升品牌知名度的重要手段。然而,许多人在初次尝试Ins运营时可能会遇到困难,不知道从何入手。本文将为您分享五大技巧,帮助您更好地运营Instagram,吸引更多…

【文章转载】Lance Martin的关于RAG的笔记

转载自微博黄建同学 从头开始学习 RAG,看Lance Martin的这篇笔记就行了,包含了十几篇论文和开源实现! —— 这是一组简短的(5-10 分钟视频)和笔记,解释了我最喜欢的十几篇 RAG 论文。我自己尝试实现每个想…

迪拜之行回顾:CESS 的 DePIN 创新之旅

迪拜最近是一个关键热词,成为了一系列 Web3 和加密活动的中心,吸引了行业领导者、创新者和爱好者,探索区块链和去中心化技术的最新发展。从 4 月中旬,一系列行业会议和活动陆续举行,吸引了一众与会者。然而暴雨积水又成…

vue集成百度地图vue-baidu-map

文章目录 vue集成百度地图vue-baidu-map1. Vue Baidu Map文档地址2. 设置npm数据源3. 安装vue-baidu-map4. 配置vue-baidu-map4.1 main.js全局注册4.2 vue页面设置4.3 效果 vue集成百度地图vue-baidu-map 1. Vue Baidu Map文档地址 https://dafrok.github.io/vue-baidu-map/#…

从0到1—POC编写基础篇(四)

接着上一篇 cprint 模块 Python内置的 print 函数可以输出任何类型的数据,但有时候输出的内容不够简洁、美观,难以直观地了解程序运行状态。cprint 库就是为了解决这个问题而生的,它可以让Python输出更简洁、更美观。 cprint 库是一个基于装…

ubuntu20.04开机运行java的sh脚本

用到了 rc.local 1、修改 /usr/lib/systemd/system/rc-local.service 在最下面添加 [Install] WantedBymulti-user.target 2、 系统没有 rc.local,需要手动创建 cd /etc vi rc.local在里面写入 /opt/start.sh chmod x /etc/rc.local # 添加可执行权限 chmod x…

基于51单片机空气质量监测报警仿真LCD1602液晶显示( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机空气质量监测报警仿真LCD显示 1. 主要功能:2. 讲解视频:3. 仿真设计:4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 基于51单片机空气质量监测报警仿真LCD显示( proteus仿真程序设计报告原理图讲解视频…

前端CSS基础10(浮动)

前端CSS基础10(浮动) 浮动元素浮动后的特点浮动后的特点浮动后的影响及解决 浮动布局小练习 浮动 CSS中的浮动是一种布局技术,常用于实现元素的排列和定位。通过使用float属性,可以让元素在页面中左浮动或右浮动,使得…

ubuntu18.04系统编译openwrt21.02.3

搭建ubuntu18.04环境 使用虚拟机安装ubuntu环境网上教程很多,这里不做赘述,主要是安装一些我们在编译openwrt时可能会用到的一些工具环境 sudo apt-get update sudo apt instll libncurses-dev gawk sudo apt-get install build-essential libncurses5…

pytest数据驱动DDT(数据库/execl/yaml)

常见的DDT技术 数据结构: 列表、字典、json串 文件: txt、csv、excel 数据库: 数据库链接 数据库提取 参数化: pytest.mark.parametrize() pytest.fixture() …

2023年图灵奖揭晓,Avi Wigderson成为双冠王

文章目录 Avi Wigderson双冠王个人简介约翰纳什致敬 Avi Wigderson 2024年4月10日,ACM宣布Avi Wigderson为2023年ACM A.M.图灵奖获得者,以表彰他对计算理论的基础性贡献,包括帮助我们重新理解随机性在计算中的作用,以及他在理论计…
最新文章