深入理解Unity的asmdef

这篇具有很好参考价值的文章主要介绍了深入理解Unity的asmdef。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Unity项目的开发过程中,我们经常需要使用各种第三方库,而这些库常常在构建时会导致无法正常编译。为了避免这种问题,Unity引入了asmdef,来解决依赖管理问题。本文将从多个方面来深入阐述asmdef的使用。

一、asmdef的概念

asmdef是指“Assembly Definition”,可翻译为“程序集定义文件”。它是Unity 2017.3版本引入的一项新功能,用于解决项目开发中出现的依赖问题。

通过asmdef文件可以定义程序集(Assembly),从而对代码的依赖进行管理。可以将一组相关的类与资源打包到一个asmdef文件中,这样可以避免在运行时出现代码找不到引用的情况。同时,asmdef也可以帮助我们更好地组织项目代码,使得整个项目的结构更加清晰。

二、asmdef的使用

1. 创建asmdef文件

创建asmdef文件非常简单。在Unity项目的Assets文件夹下,右键选择“Create->Assembly Definition”即可创建一个asmdef文件。

Assets/
  MyAssembly/
    MyAssembly.asmdef

2. asmdef文件的内容

asmdef文件的内容非常简单,只包含几个必要的字段:name,references,includePlatforms和excludePlatforms。

其中,name字段是Program Assembly的名字,必须与程序集名字相同。references字段表示引用的程序集,即在此Program Assembly中需要引用的其他程序集文件。includePlatforms和excludePlatforms字段是指定Build时需要包含或者排除的平台。

{
    "name": "MyAssembly",
    "references": [],
    "includePlatforms": [],
    "excludePlatforms": []
}

3. 添加脚本到asmdef文件中

在asmdef文件中添加脚本非常简单,只需要将脚本文件夹拖到asmdef引用面板即可。我们可以将所有相关脚本都拖到同一个asmdef文件夹中来简化管理。

从Unity 2021.2版本开始,我们还可以直接在项目视图中进行asmdef文件的操作。通过右键选择“Add>>Scripts”可以将整个脚本文件夹添加到asmdef中,非常方便。

4. 编译asmdef文件

在Unity中,如果没有特定地设置每一个脚本的编译方式,Unity会默认将所有脚本打成一个Assembly,这意味着当有脚本需要更改时,会将整个程序集重新编译一次。如果引用了大量的第三方库,在重新编译整个程序集时,会消耗大量的时间。

使用asmdef文件可以避免这个问题,因为asmdef文件是可以单独编译的。asmdef文件中规定了Assembly的命名空间和程序集名,我们可以在编译时选择只编译某个Assembly,而不需要重新编译整个程序集。

使用asmdef文件不仅可以节省时间,也可以帮助我们更好地管理依赖关系和组织代码结构。

三、asmdef在项目中的应用

1. 模块化开发

使用asmdef文件可以帮助我们实现模块化开发,将不同功能的代码放置在不同的程序集中管理。这样,代码组织得更加清晰明了,也方便团队合作。

// Module 1: 
namespace MyGame.Module1 
{ 
    public class MyClass1 { } 
}

// Module 2: 
namespace MyGame.Module2 
{ 
    public class MyClass2 { } 
}

// MyGame.asmdef references MyGame.Module1.asmdef and MyGame.Module2.asmdef 

2. 多版本管理

使用asmdef文件可以帮助我们实现版本控制。例如,当我们需要为不同的平台打包不同的Assembly时,我们可以使用不同的asmdef文件。我们还可以使用条件编译指令来控制在不同的平台上编译不同版本的代码。

3. 第三方库管理

当我们的项目需要使用第三方库时,我们可以将其打包成一个单独的程序集。在引用第三方库时,我们只需要参照其官方文档添加相应的asmdef文件,就可以避免其对其他代码的影响。

结论

通过本文的介绍,我们可以看到asmdef可以帮助我们更好地进行依赖管理和代码组织。使用asmdef可以实现模块化开发、版本管理和第三方库管理等功能,同时还可以避免整个程序集的重新编译,从而提高构建效率。因此,在Unity项目开发中,我们应该积极地使用asmdef文件。

注意:ADF所在的文件夹名称,以及ADF的文件名,跟程序集的名称没有关系。程序集的名称只跟ADF文件中的Name属性有关。创建时对ADF命名的话,属性中的Name也会相应修改。

深入理解Unity的asmdef

实战环节

 

下面我们使用一个实际案例看看这个功能如何使用 

例如在2017.3之前的版本中的的脚本目录结构是这样的

深入理解Unity的asmdef

在2017.3之前的版本中,这些脚本最后会全部被编译到一个Assembly-CSharp.dll中

再来看下如果我们创建了程序集定义文件(Assembly Definition File)后会怎样

创建ADF文件

我们按照目录结构分别创建一个ADF,并且在Scripts文件夹下创建一个Main的ADF

深入理解Unity的asmdef

我们随便打开一个脚本,可以看到VS将这几个分别识别为了几个C#工程

深入理解Unity的asmdef

刚刚创建的ADF还差一些没有设置,就是依赖关系,比如Network要依赖SDK中的内容,如果不设置,就会像下图一样报错

深入理解Unity的asmdef

同时VS中也会报错

深入理解Unity的asmdef

下面我们来修复这个问题,选中Network ADF文件,然后在References中添加SDK的引用,别忘了点击下面的Apply

深入理解Unity的asmdef

现在不报错了,再打开VS,也不报错了,可以看到Network这个C#工程中加了一条SDK的引用

深入理解Unity的asmdef

常见问题:多层级的ADF

如果一个文件夹及子文件夹中,有多个ADF,每个脚本被添加到离这个脚本最短路径的ADF中去。

比如上面实战环节的Utils中并没有创建ADF,那么ADF就会被添加到父目录的Main中

深入理解Unity的asmdef

深入理解Unity的asmdef

如果你搞不清楚一个脚本究竟被包含在了哪个ADF中,只需要选中这个脚本,在Inspector面板中就会清楚的看到

最佳实践

强烈建议你对项目中的所有脚本使用ADF,或完全不使用。否则,没有使用ADF的脚本会在每次ADF重新编译时也被重新编译。这会减少你在项目中ADF所带来的好处。

还有就是一定要对目录结构好好进行划分

感觉这个功能设计是好的,但是实际项目中由于脚本文件的划分,和自己定义公共插件库的划分不是非常明确,导致脚本直接会经常出现引用,如果引用过多,就导致ADF失去了他的优势,反而感觉比较麻烦,容易出现问题。个人感觉如果项目编译真的很慢,而且项目脚本功能有明确的划分,实在ADF还是不错的选择。



 链接:https://www.jianshu.com/p/53161ce351e7
 文章来源地址https://www.toymoban.com/news/detail-492207.html

到了这里,关于深入理解Unity的asmdef的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink 深入理解任务执行计划,即Graph生成过程(源码解读)

    我们先看一下,Flink 是如何描述作业的执行计划的。以这个 DataStream 作业为例,Flink 会基于它先生成一个 StreamGraph。这是一个有向无环图,图中的节点对应着计算逻辑,图中的边则对应着数据的分发方式。 Flink 会根据节点的并行度以及他们之间的连边方式,把一些计算节点进

    2024年02月22日
    浏览(45)
  • 《深入理解Java虚拟机》读书笔记: 虚拟机类加载的时机和过程

    虚拟机类加载的时机和过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个

    2024年02月12日
    浏览(42)
  • 深入理解TCP三次握手与四次挥手过程以及抓包实验

    最近,我正好在做socket相关的实验,发现现在对计算机网络知识有一点点模糊,借此机会,熟悉一下TCP连接过程并利用WireShark工具进行测试。 源端口号:占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程。 目的端口号:占16比特,写入目的端口号,用来 标识接

    2024年02月08日
    浏览(43)
  • 【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月11日
    浏览(45)
  • 齐次矩阵的理解深入和在图形学、Unity中的应用

    在探讨图形学和Unity中的3D编程时,我们经常会遇到一个非常核心的数学工具—— 齐次矩阵 。这篇文章将一步步深入地探讨齐次矩阵的基本概念、它在图形学中的应用,以及如何在Unity中利用这一概念来创建令人震撼的3D场景。 首先,我们来聊聊什么是齐次坐标。在二维空间

    2024年01月22日
    浏览(43)
  • 深入理解JavaScript模块化开发

    前言: 随着JavaScript应用程序的复杂性不断增加,模块化开发成为了一种必备的技术。通过将代码划分为模块,我们可以提高代码的可维护性、可重用性和可扩展性。在本文中,我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块化方案。 模块化开发是将一个大型应

    2024年02月08日
    浏览(92)
  • “深入理解SpringMVC的注解驱动开发“

    在现代的Web开发中,SpringMVC已经成为了一个非常流行和强大的框架。它提供了许多注解来简化开发过程,使得我们能够更加专注于业务逻辑的实现。本文将深入探讨SpringMVC的注解驱动开发,重点关注常用注解、参数传递、返回值和页面跳转等方面。 1.1 @Controller @Controller注解用

    2024年02月09日
    浏览(37)
  • 深入理解JAVA垃圾收集器CMS,G1工作流程原理 GC流程图 什么社会触发Minor GC?触发MinorGC过程。Full GC 过程。

    JVM内存空间基础知识点(基于JDk1.8) 1.方法区:逻辑概念,元空间,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。 2.程序计数器:程序计数器可以看作当前线程所执行的字节码的

    2024年04月25日
    浏览(41)
  • Java开发 - 深入理解Redis哨兵机制原理

    Redis的主从、哨兵模式、集群模式,在前文中都已经有了详细的搭建流程,可谓是手把手教程,也得到了很多朋友的喜欢。由于前文偏向于应用方面,就导致了理论知识的匮乏,我们可能会用了,但却不明所以,所以今天,博主就通过接下里的几篇博客给大家分别讲解Redis哨兵

    2024年02月17日
    浏览(41)
  • 深入理解 Webpack 热更新原理:提升开发效率的关键

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年03月10日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包