为啥unity代码克隆不了物体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥unity代码克隆不了物体相关的知识,希望对你有一定的参考价值。

参考技术A 因为结果无法控制。
因为如果一旦调用这个脚本,那么产生的克隆物体将作为prefab的子物体,那么下一次调用的时候,上一次的子物体一起被克隆,就出来了2个。

unity放大缩小很慢

1.为了搞清楚缩小很慢我这里使用Unity2021LTS版本新建个项目。
GIF

2.这个时候Unity会自动打开我们刚创建的项目,我们直接去资源管理器里面查看一下Unity都为我们创建了哪些文件。
GIF

这个时候,我们重点关注一下Library文件夹,俗称的库文件。

3.打开Library文件夹,我们可以看到一个名为脚本程序集的文件夹ScriptAssemblies,这里是存放我们代码、程序集的地方。映入眼帘的是一堆dll和pdb文件:

这个时候你可能会有疑问了,我一个空的项目会什么会有这么多程序集?
想要搞明白这点,我们需要先了解一下Unity包中的清单,也叫项目清单。

项目清单

这是官方对项目清单的解释:Unity 加载项目时,Unity Package Manager 会读取项目清单,以便计算要获取并加载的包的列表。
猜想1:这个会不会是导致Unity变慢的原因呢?我们该如何验证这点呢?
打开manifest.json文件,映入我们眼帘的是一堆依赖项。如果我们将所有的依赖项全部删除会发生呢?

下面是删除之后的样子:

回到Unity,首先Unity会删除上文中提到的ScriptAssemblies文件夹,然后重新编译整个项目。这个时候我们再打开ScriptAssemblies查看一下文件夹的内容,你会发现,所有的dll和pdb文件都消失了,变成了一个空文件夹。

这个时候,我们不仅验证了我们的猜想1,还得出一个结论:没有依赖项,就没有程序集。单有这点我觉得还不够,接下来我们继续!
再次回到Unity,我们创建个HelloWorld脚本。这个时候Unity会自动为我们创建个Assembly-CSharp.dll。
GIF

查看一下ScriptAssemblies文件夹的变化,里面多了Assembly-CSharp.dll和Assembly-CSharp.pdb两个文件。这就说明我们新建的HelloWorld脚本已经被Unity构建和编译,这就是弹出进度条的原因。

如果你觉得不可置信。那么我们可以将Assembly-CSharp.dll拖入dnSpy或者dotPeek中反编译查看一下里面的内容:

是不是觉得很酷?这不就是我们刚才新建的HelloWorld吗?这也就说明Assembly-CSharp.dll由HelloWorld.cs编译而成。
接下来删除HelloWorld.cs,伴随着读条结束,ScriptAssemblies文件夹会被再次清空。
构建属于自己的程序集

如果我们构建属于我们自己的程序集,而不是让Unity自动为我们生成Assembly-CSharp.dll,会大大提升编译速度和减少读条时间吗?
为了验证这点,我们新建Scripts -> My Assembly -> My Code.asmdef程序集,这个时候ScriptAssemblies文件夹还不会发生任何变化,因为这是个空的程序集,内部没有任何代码。我们只需要在My Code.asmdef同层级下创建个名为MyCode.cs的脚本即可

这个时候打开ScriptAssemblies文件夹我们会神奇的发现,这里出现的是我们自己的程序集,而不是Unity自动为我们生成Assembly-CSharp.dll。OHHHHHHHHHHHH....

猜想2:如果asmdef脚本没做任何变动,Unity会默认会跳过编译这部分代码吗?
我们可以再次验证一番,反正验证又不收钱。HAHAH~
我们在My Assembly文件夹同级目录再次创建HelloWorld.cs。注意创建位置,不要创建到My Assembly文件夹内部,那样就归属于My Code.asmdef的管辖范围了。后面有机会再和大家仔细的聊聊 asmdef,这里留个坑。如下图:

这个时候打开ScriptAssemblies文件夹我们会神奇的发现,Unity自动为我们生成了船新的Assembly-CSharp.dll,留意一下后面的修改日期。而MyCode.dll的修改日期是没有发生任何变化的,也就验证了猜想2Unity为我们跳过编译这部分代码结论是正确的。

那么我们把一些不常修改的代码,如底层框架和一些通用的拓展方法写到属于我们自己的程序集里面,那编译时间不久大大的减少了吗?你学废了吗?

总结

优化依赖项会大大提升我们的编译速度。
构建属于我们自己的程序集,而不是让Unity自动为我们生成Assembly-CSharp.dll也会大大提升编译速度和减少读条时间。
参考技术A unity放大缩小很慢 这个跟你的显卡这些没关系,可能你当时开的画面比较多,机子一时间反应不过来,还有就是你处理刚装完某个程序或者软件时没有重启也

以上是关于为啥unity代码克隆不了物体的主要内容,如果未能解决你的问题,请参考以下文章

unity代码不能赋予物体

unity克隆物体时,会重建材质球么

unity放大缩小很慢

unity3D 怎么才能只在原物体上克隆新物体

unity3d我想把物体拖拽到脚本里为啥不行呢?如图

为啥我unity3d 用以下代码没有出现球体?