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

4

获取一个带有本地低级插件的Unity项目...Mac版本。

enter image description here

在Xcode插件项目中进行小改动并构建。

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

如果再次“Build”,最终的Mac应用程序当然现在包含了新库——没有问题。

然而……

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

它将无法获取库中的更改。

事实上,似乎:

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

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

这是怎么回事?


更多信息:

似乎mac共享的库/捆绑包无法卸载。文章:

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年左右的任何时间。

也许你只需要使用 AssetDatabase.Refresh - derHugo
你好 @derHugo - 我相信这与菜单功能“重新导入所有资源”是一样的,但实际上我尝试了AssetDatabase.Refresh,它并没有起作用!新年快乐! - Fattie
是的,我明白了...有道理^^也祝你新年快乐;) - derHugo
@Fattie,你找到的新信息有助于解决问题吗? - Remy
不,我相信没有解决方案!@remy_rm - Fattie
1个回答

7
很遗憾,你无法对此做任何事情。就.NET的DLL处理而言,不能单独卸载DLL,而不关闭应用程序域。虽然Unity会捕获对DLL所做的更改,但旧版本仍会保留在内存中,并在编辑器中运行时使用。一个“有趣”的事情是,您可以通过从编辑器中删除本地插件来查看它的运作情况。确认您要删除该文件。该文件将从检查器中消失。但是,如果您右键单击文件夹并刷新(ctrl+r),则会看到该文件被重建(这也发生在点击“重新导入所有”时,因为应用程序域未关闭,尽管Unity正在重新启动)。构建应用程序时,它将使用本地存储的文件,而不是内存中存储的文件。因此插件在构建时会得到更新。

没有办法卸载单个程序集,而不卸载包含它的所有应用程序域。即使程序集超出作用域,实际的程序集文件仍将加载,直到包含它的所有应用程序域都被卸载。

source

这已经成为一个问题有一段时间了,人们已经尝试过解决方法,但据我所知现在存在的“解决方法”仅适用于Windows。以下是一些讨论它的链接。 我想可以做的是编写一个包装器,当编辑dll时自动重新启动Unity...虽然这不会解决问题,但至少会减少一些麻烦。

1
是的,这是我自己一段时间前偶然发现的一个小众问题。也许值得将其作为一个功能请求(尽管即使如此,它仍取决于他们是否能够控制它)。只是一个想法;可能可以编写一个编辑器脚本,为上传/更新的DLL添加某种版本控制。这将把“新”的dll加载到内存中,并更新所有对旧dll的引用到新的正确的“版本”号。但根据dll的大小,这可能会导致严重的内存问题。但如果它可以减少需要重新启动的次数... - Remy
1
@Fattie 今天我注意到一个有趣的事情,支持上述观点:如果您在编辑器中删除未受管理/本地插件,而编辑器仍然打开。它会提示您“真的要删除它,因为此操作是不可逆的”。现在,如果您单击“删除”图标将消失(使您相信它已经被删除)。但是!如果您右键单击文件夹并“刷新”,则会看到该文件从内存中重建,并且实际上并没有被删除! - Remy
天哪!感谢@remy_m的报告。这绝对是一个敏感的问题。 - Fattie
1
关于这个问题,@remy_m..我的同事给了我一些信息;请注意我的编辑“更多关于此的信息:”。你认为这就是吗? - Fattie
@Fattie 这确实很有趣,可能提供了一种完全卸载bundle的方法。但是,“有几种情况下动态库永远不会被卸载:1)主可执行文件链接到它。”我认为这仍然可能是一个问题,因为Unity.exe是主要的可执行文件,并且可能会保持链接状态。不过,我认为这绝对值得一试。不幸的是,我无法自己测试,因为我没有osx / ios设备。(您可能还想添加xcode / osx标签,因为他们可能更了解它!) - Remy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接