Unity开发Mac应用:文件关联后双击打开报错的解决方法
解决Unity Mac应用关联文件后无法打开的问题
原因分析
你配置的Info.plist已经让系统识别了XXX文件类型,但Mac系统要求应用必须实现对应的文件打开回调方法,否则会弹出“无法打开文档”的错误。Unity默认没有处理这些原生回调,因此需要通过原生插件+Unity C#脚本的方式来实现。
实现步骤
1. 编写Objective-C原生插件
创建一个.mm文件(例如MacFileHandler.mm),内容如下:
#import <Cocoa/Cocoa.h> @interface UnityAppController (FileOpen) @end @implementation UnityAppController (FileOpen) - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { // 将文件路径传递给Unity的C#脚本 UnitySendMessage("FileOpenHandler", "HandleOpenFile", [filename UTF8String]); return YES; } - (void)application:(NSApplication *)sender openFiles:(NSArray<NSString *> *)filenames { // 处理多文件打开场景,逐个传递文件路径 for (NSString *filePath in filenames) { UnitySendMessage("FileOpenHandler", "HandleOpenFile", [filePath UTF8String]); } // 通知系统文件已处理完成 [[NSApplication sharedApplication] replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; } @end
这段代码扩展了Unity默认的UnityAppController(它本身是NSApplicationDelegate的实现),添加了openFile和openFiles方法,通过UnitySendMessage将文件路径传递给Unity中的C#脚本。
2. 创建Unity C#接收脚本
新建C#脚本FileOpenHandler.cs,挂载到场景中一个不会被销毁的GameObject上(GameObject命名为FileOpenHandler,需与上面UnitySendMessage的第一个参数一致):
using UnityEngine; public class FileOpenHandler : MonoBehaviour { private void Awake() { // 确保场景切换时该对象不被销毁 DontDestroyOnLoad(gameObject); } // 该方法会被原生插件调用 public void HandleOpenFile(string filePath) { Debug.Log("接收到文件路径: " + filePath); // 在此添加你的文件导入逻辑,比如解析XXX文件内容 ProcessImportedFile(filePath); } private void ProcessImportedFile(string filePath) { // 替换为你实际的文件处理代码 Debug.Log("正在处理文件: " + filePath); // 示例:读取文件内容 string fileContent = System.IO.File.ReadAllText(filePath); Debug.Log("文件内容: " + fileContent); } }
3. 配置Unity项目
- 将
MacFileHandler.mm文件放到Unity项目的Assets/Plugins/Mac目录下(无此目录则新建)。 - 确保挂载了
FileOpenHandler脚本的GameObject在启动场景中,保证应用启动时能接收回调。
4. 重新构建应用
重新导出Mac应用,此时双击XXX文件:
- 若应用未启动,会先启动应用,随后
HandleOpenFile方法会收到文件路径。 - 若应用已在运行,会直接触发
HandleOpenFile方法处理文件。
额外注意事项
- 确认Info.plist中的
CFBundleTypeRole设置正确:若应用需编辑文件,设为Editor;仅查看则设为Viewer(当前你的设置是正确的)。 - 测试时建议先删除旧版本应用,再安装新构建的版本,避免系统缓存旧配置。
内容的提问来源于stack exchange,提问作者ya_mo_suzuki
相关产品推荐
相关产品推荐

