您如何在 Unity / Mac 中重置或重新导入插件?

How do you reset or reimport, plugins, in Unity / Mac?

获取带有原生低级插件的Unity项目..Mac版本。

对 Xcode 插件项目进行小改动,然后构建。

您现在在 Unity 项目中有了新的插件库。

如果您再次“构建”,最终的 Mac 应用程序当然现在包含新库 - 没问题。

然而.....

如果您在编辑器中点击播放

它不提取库中的零钱。

事实上看来:

每次在 Unity 中更改库时,您必须重新启动 Unity!

一切都试过了,“重新导入所有资产”,AssetDatabase.Refresh,重命名等等。看来你确实必须 重新启动 Unity。

这是怎么回事?


关于此的更多信息:

看来mac共享libraries/bundles无法卸载。文章:

https://docstore.mik.ua/orelly/unix3/mac/ch05_03.htm

显然这是在 10.5 中修复的:

https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlclose.3.html

也许 Unity 现在可以解决这个问题。按照他们通常的速度,它应该会在 2035 年左右发生。

遗憾的是,你对此无能为力。

根据 .net 的 DLL 处理,在不关闭应用程序域的情况下无法单独卸载 DLL。当 Unity 获取对 DLL 所做的更改时,旧版本保留在内存中并在运行时在编辑器中使用。 "funny" 您可以通过从编辑器中删除本机插件来查看实际效果。确认您要删除该文件。该文件将从检查器中消失。但是,如果您右键单击该文件夹并刷新 (ctrl+r),您将看到该文件被重建(当点击 "re-import all" 时也会发生这种情况,因为应用程序域没有关闭,尽管 unity 重新启动)。

构建应用程序时,它将使用本地存储的文件,而不是内存存储的文件。因此插件在构建时被更新。

There is no way to unload an individual assembly without unloading all of the application domains that contain it. Even if the assembly goes out of scope, the actual assembly file will remain loaded until all application domains that contain it are unloaded.

source

这个问题已经存在一段时间了,人们已经尝试解决 and/or 修复问题,但据我所知,现在存在的 "work arounds" 是针对 windows 只有。这里有一些相关讨论的链接。

我想 可以 做的事情是编写一个包装器,在编辑 dll 时自动重启 Unity...虽然这不能解决问题,但它会至少让它少一些麻烦。