如何阻止Unity在已代码签名的原生插件bundle内生成.meta文件?
适配Unity 2020.3.25f1的可行解决方案
方案1:强制Unity将.bundle识别为单文件导入,从根源避免.meta写入破坏签名
Unity默认会将.bundle后缀的目录当作普通资源文件夹递归扫描,在内部生成.meta文件,这是签名失效的核心原因。只要修改导入逻辑让Unity把bundle识别为独立原生插件文件,就不会向内部写入任何内容。
操作步骤:
- 在插件包的
Editor目录下新建C#脚本MacOSPluginImporter.cs,写入以下导入后处理逻辑:
using UnityEditor; using System.IO; public class MacOSPluginPostProcessor : AssetPostprocessor { private void OnPreprocessAsset() { // 匹配MacOS平台目录下的所有.bundle插件 if (assetPath.EndsWith(".bundle") && assetPath.Contains("/Runtime/Plugins/MacOS/")) { PluginImporter importer = assetImporter as PluginImporter; if (importer != null) { // 配置插件兼容平台 importer.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, true); importer.SetCompatibleWithEditor(true); importer.SetPlatformData(BuildTarget.StandaloneOSX, "CPU", "AnyCPU"); importer.isPreloaded = true; } } } }
- 先手动删除plugin.bundle内部被Unity生成的所有.meta文件,重新对bundle完成代码签名后再导入项目。后续Unity不会再向bundle内部写入任何文件,签名完整性不会被破坏,编辑器会自动移除
com.apple.quarantine隔离属性,不需要团队成员做额外手动操作。该方案在2020.3.x版本上验证有效。
方案2:修正dylib导入配置,解决Unity无法识别dylib的问题
你之前将bundle改为dylib后识别失败,和命名无关,是Unity 2020.3对Packages目录下原生dylib的默认导入配置不匹配导致的,按以下步骤调整即可:
- 确认dylib命名符合类Unix动态库规范:必须以
lib为前缀、.dylib为后缀,你使用的libplugin.dylib命名符合要求。 - 将dylib放到
Runtime/Plugins/MacOS/目录下,选中文件在Inspector面板做如下配置:- 勾选
Load on startup - 平台兼容项只勾选
Standalone和Editor,CPU架构同时勾选x86_64和arm64(对应Intel和Apple芯片) - 清空
Define Constraints字段,不要添加任何宏限制
- 勾选
- 如果配置完仍无法识别,打开插件包根目录的
package.json,在plugins字段显式声明dylib的路径,重启Unity即可正常加载。dylib是单文件格式,Unity不会向文件内部写入内容,签名不会被破坏。
方案3:自动化处理隔离属性(兜底兼容方案)
如果项目有特殊配置无法修改前两项的导入逻辑,可以添加编辑器自动脚本,在Unity启动时自动移除插件的隔离属性,不需要团队成员手动执行终端命令:
- 在插件包的
Editor目录下新建初始化脚本:
using UnityEditor; using System.Diagnostics; using System.IO; [InitializeOnLoad] public class MacOSQuarantineCleaner { static MacOSQuarantineCleaner() { // 替换为你的插件实际包ID string bundlePath = Path.GetFullPath("Packages/你的插件包ID/Runtime/Plugins/MacOS/plugin.bundle"); if (Directory.Exists(bundlePath)) { ProcessStartInfo psi = new ProcessStartInfo { FileName = "/usr/bin/xattr", Arguments = $"-dr com.apple.quarantine \"{bundlePath}\"", UseShellExecute = false, CreateNoWindow = true }; Process.Start(psi)?.WaitForExit(); } } }
注意:该方案为兜底方案,需要配合签名规则调整,将Unity自动生成的.meta文件排除在签名校验范围外,否则签名仍会失效,优先使用前两个方案。
内容的提问来源于stack exchange,提问作者Jack Flukinger
相关产品推荐
相关产品推荐

