关于Unity程序集这件事?

9 篇文章 0 订阅

这个始于一个很简单的问题:SteamVR2.0里面添加自己写的脚本调用不起来,搞很久终于搞明白了,这里用一个很简单的事例来解释。

先新建一个工程,在Project下新创建了一个文件夹Scripts1,文件夹下创建了一个名为ABC的脚本文件。

然后,我又在Assets目录下,又新建了一个名ABC的脚本文件,结果看下图:

 很明显示报错了,现在不着急,我们在Scripts1文件下再创建一个名为Assembly Definition的文件。

 文件创建好后,报错消失了,这是为什么呢?

 没错,这个就是程序集的!!!

 现在,让我们用Visual Studio打开代码看一下。

 

看出问题了吗?

对的,我们新建了一个程序集(NewAssembly),让两个ABC脚本处于了不同的程序集,一个是Unity默认的程序集,另一个是我们新建的,就像Windows同一个文件夹下不能有同名文件,同一个程序集下也不能有同名的脚本。

下面我们开始正式讲一下程序集:

Unity程序集没有想的那么难,我们可以将C#想像成小说文件,而程序集的作用就是给它们分类,将不同题材的小说文件分到一堆去,修仙的一堆、科幻的一堆、灵异的又是一堆,这个分类又有什么用呢?

效率问题,先看一下当我们创建了一个Assembly Definition(程序集)文件时,工程文件发生了什么变化:

 在项目的根目录下多出了一个NewAssembly.csproj文件,还有就是Unity项目默认创建就有的Assembly-CSharp.csproj文件,这些.csproj文件表示有一个这样的文件就会有一个程序集,是不是跟上图Visual Studio的程序集一样,这些.csproj文件还会生成对应的dll文件,每次修改C#代码返回Unity后,C#代码文件所对应的程序集,就会重新编译一次,重新生成新的dll文件。

当该文件夹中没有下图的Assembly Definition及Assembly Definition Renference文件时,在默认情况下,Unity几乎将所有游戏脚本都编译到了预定义程序集Assembly-CSharp.dll中。

 这就解释最开始的例子问题了,当有两个ABC脚本却没报错,因为我们在Scripts1中创建了一个新的程序集NewAssembly,将两个名称相同的ABC脚本文件分配到了不同的程序集中。

在Unity中建多个程序集可以提高效率,就像一个机器的零部件,它就是一个整体,但零部件某个部分在使用过程中经常坏,且机器的零部件价格较贵,为了节约成本,于是设计人员就把经常坏的部分单独拆分开来,让一整个机器的零部件拆分成两个零部件,当经常坏部分坏了,就可以只换坏的部分了。

同理,当我们在Unity中没有创建任何程序集时,大部分C#脚本几乎都归于程序集Assembly-CSharp,该程序集中的任意一个C#脚本发生改变时,计算机就要重新编译整个程序集,生成新的DLL文件,脚本少还好,但如果一个Unity项目中有几千个脚本文件,当你修改完成代码返回Unity时,就会出现Unity加载速度慢或直接卡死的情况,这就是程序集的分块更新,可用于提高Unity的编译效率,这个对于大项目才有明显的作用,小项目加不加没太大区别。

程序集的分块更新仅限于提高编译效率,不!

其实你每天都可能用到它。

 没错,就是Unity的Packages Manage,每一个包都会有自己的程序集,这些程序集包含了该包的所有代码,当某天Timeline包更新了,Packages Manage只要找到Timeline程序集,去更新这个程序集,从而只重新加载Timeline的包,其它包就不会跟着重新加载。

1、 程序集定义资源,它是一个文本文件,文件扩展名为 .asmdef,其中包含定义程序集定义属性的 JSON 字符串。

2、通过定义程序集,可以组织代码促进模块化和可重性,为项目自定义的程序集中的脚本不再添加到默认程序中,并且只能访问指定的其它程序集中的脚本。

3、在文件夹中创建一个程序集定义资源后,Unity会从该文件夹中的所有脚本编译一个单独的托管程序集。除非子文件夹有自己的程序集定义,否则将包含子文件夹中的脚本。这些托管程序集充当 Unity 项目中的单个库。

4、在一个文件夹中最多只有一个程序集资源(只能存一个Assembly Definition文件或Assembly Definition Renference文件),程序集资源只能单向引用,不能A引用B,B又引用A,当引用B时,A能使用B程序集代码,但B不能使用A的代码

5、当文件夹中有程序集资源时,它的访问范围只在被引用和当前文件夹的程序集中,即预定义程序集Assembly-CSharp中的脚本可以访问到自定义程序集内的代码,但是自定义程序集内的代码想访问其它的程序集代码,则要添加相应的程序集引用

6、当其中一个文件夹中创建了自定义程序集后,另一个文件夹是它的同级目录,但想两个文件属于同一个程序集,则在另一个文件夹添加Assembly Definition Renference文件,并引用第一个文件夹的自定义程序集

注意,有一个很重要的点,但你创建了程序集的所在文件本下有Editor这个特殊文件夹,那么在这个Editor文件夹下也要创建程序集,且设定只适用于Editor,其它不适用,不然后打包会报错

Unity官方文档:程序集定义 - Unity 手册

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值