当前位置: 首页 > news >正文

理解Unity脚本编译过程:程序集

https://docs.unity3d.com/Manual/script-compilation.html

关于Unity C#脚本编译的细节,其中一个比较重要的知识点就是如何自定义Assembly。

预定义的assembly

默认情况下,Unity会按照这个规则进行编译。

PhaseAssembly nameScript files
1Assembly-CSharp-firstpassRuntime scripts in folders called Standard Assets, Pro Standard Assets and Plugins.
2Assembly-CSharp-Editor-firstpassEditor scripts in folders called Editor that are anywhere inside top-level folders called Standard Assets, Pro Standard Assets and Plugins.
3Assembly-CSharpAll other scripts that are not inside a folder called Editor.
4Assembly-CSharp-EditorAll remaining scripts (those that are inside a folder called Editor).

根据阶段的编号,从上到下进行编译。

条件编译

可以通过与定义宏,进行条件编译。需要特别注意的是编辑器的情况,如果想要条件编译在编辑器模式下生效,宏定义修改后需要对脚本进行重新编译,否则条件编译不生效。并且,我们在CI中使用Unity的headless模式,无法实现这一特点。

自定义assembly

https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html

在这里插入图片描述

assembly 程序集,是一个包含编译过的c#代码和程序集依赖关系的代码库。自定义assembly可以增强代码模块化和重用性,

创建一个assembly

使用 Assets/Create/Assembly Definition在文件夹下创建一个asset,Unity会根据其设置,把该文件夹下所有代码编译到这个assembly中。包含其内部的子文件夹,除非子文件夹下也定义了assembly definition asset。

如果想要把其他文件夹下的内容也包含到某一个assembly当中,需要在该文件夹内定义一个assembly definition reference,并且设置reference的assembly。

引用和依赖

当一个类使用到另外一个类,就表示它依赖于另外一个类。如果两个类型在不同的assembly当中,那么第一个类的assembly需要引用另外的assembly。

默认情况下,预定义的assembly会自动引用自定义assembly和预编译assembly(Plugins)。可以通过关闭Auto Referenced选项,取消自动引用。关闭以后,自定义assembly的修改不会引发预定义assembly的重新编译,同时预定义assembly中的代码不能访问自定义assembly中的内容。需要跟进情况斟酌。

在这里插入图片描述

疑问:这里的.asmdef不能访问Assembly-CSharp中的内容,但是它可以访问所有的Unity程序集代码、Packages中的代码,文档中没有详细说明,它们是属于Precompiled Assemblies吗?

仔细看asmdef的内容,发现程序集默认依赖了引擎的程序集,No Engine References可以取消引用;另外Packages中的访问,也必须定义引用才行,使用Assembly Definition References进行设置。

循环引用

不同程序集之间不允许循环引用,如果发生了会报错。

其他

assembly definition asset还有很多其他的设置项,跟进情况查看文档使用。


http://www.mrgr.cn/news/83287.html

相关文章:

  • 【Ubuntu 上搭建 Nginx-RTMP 服务】
  • AWS re:Invent 2024 现场实录 - It‘s all about Scale
  • 关于大数据的基础知识(二)——国内大数据产业链分布结构
  • Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力
  • unity学习12:地图相关的一些基础2, 增加layer种草种树
  • RK3568-uboot/kernel编译命令
  • .NET framework、Core和Standard都是什么?
  • python学习笔记—16—数据容器之元组
  • 微信小程序——创建滑动颜色条
  • 【前端】【CSS3】基础入门知识
  • 初学stm32 --- ADC单通道采集
  • 英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望
  • 记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
  • EasyExcel的应用
  • 基于phpstudy快速搭建本地php环境(Windows)
  • Linux x86_64 程序静态链接之重定位
  • 前端for循环遍历——foreach、map使用
  • CSS基础入门
  • 设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析
  • vue3 面试题:vue3和vue2有什么区别?
  • uniapp 微信小程序内嵌h5实时通信
  • MatLab基本语法
  • Freemarker-语法笔记
  • 单例模式-如何保证全局唯一性?
  • 前端前置知识
  • Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)