You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:31:07