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

如何在macOS原生应用中集成Unity as a library并使用SwiftUI视图?

如何将Unity集成到macOS原生SwiftUI应用中

以下是可行的实现方案,直接将Unity作为Framework嵌入到macOS原生项目,同时支持SwiftUI视图集成:

1. 导出Unity为macOS Framework

  • 打开Unity项目,切换到macOS平台(Build Settings > Platform > macOS)
  • 在Build Settings中设置Build Type为Framework
  • 配置Player Settings:设置匹配的Bundle ID,根据需求勾选"Enable macOS Universal Build",然后导出Framework到本地目录

2. 集成Unity Framework到SwiftUI项目

  • 新建或打开你的SwiftUI macOS项目,将导出的Unity Framework拖入项目,勾选"Copy items if needed"
  • 在项目Target的Frameworks, Libraries, and Embedded Content中,将Unity Framework的Embed属性设置为Embed & Sign

3. 封装Unity生命周期管理类

创建一个UnityManager类来统一管理Unity的初始化、视图获取和销毁:

import Foundation
import UnityFramework

class UnityManager: ObservableObject {
    private var unityFramework: UnityFramework?
    
    func startUnity() {
        guard let frameworkPath = Bundle.main.path(forResource: "UnityFramework", ofType: "framework") else { return }
        unityFramework = UnityFramework.loadFramework(atPath: frameworkPath)
        unityFramework?.setExecuteHeader(CommandLine.argc, CommandLine.unsafeArgv)
        unityFramework?.runEmbedded(withArgc: CommandLine.argc, argv: CommandLine.unsafeArgv, appLaunchOpts: nil)
    }
    
    func getUnityView() -> NSView? {
        return unityFramework?.appController().rootView
    }
    
    func stopUnity() {
        unityFramework?.unloadApplication()
    }
}

4. 封装SwiftUI可使用的Unity视图

通过NSViewRepresentable将Unity的NSView包装为SwiftUI可识别的视图:

import SwiftUI

struct UnityView: NSViewRepresentable {
    @ObservedObject var unityManager: UnityManager
    
    func makeNSView(context: Context) -> NSView {
        let containerView = NSView()
        // 延迟获取Unity视图,等待Unity初始化完成
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            guard let unityRootView = unityManager.getUnityView() else { return }
            unityRootView.frame = containerView.bounds
            unityRootView.autoresizingMask = [.width, .height]
            containerView.addSubview(unityRootView)
        }
        return containerView
    }
    
    func updateNSView(_ nsView: NSView, context: Context) {}
}

5. 在SwiftUI主视图中使用Unity

在你的SwiftUI视图中调用UnityManager并嵌入UnityView:

struct ContentView: View {
    @StateObject private var unityManager = UnityManager()
    
    var body: some View {
        VStack(spacing: 20) {
            Button("启动Unity") {
                unityManager.startUnity()
            }
            .buttonStyle(.borderedProminent)
            
            UnityView(unityManager: unityManager)
                .frame(minWidth: 800, minHeight: 600)
                .border(Color.gray)
        }
        .padding()
        .onDisappear {
            // 页面消失时停止Unity
            unityManager.stopUnity()
        }
    }
}

注意事项

  • 架构兼容:确保Unity导出的Framework和你的SwiftUI项目架构一致(推荐导出Universal Build支持arm64和x86_64)
  • 生命周期同步:可以添加通知监听,在macOS应用进入后台/前台时,调用Unity的Pause/Resume方法
  • 双向通信:SwiftUI和Unity之间的通信可通过Unity的SendMessage API,或者通过Objective-C桥接头实现原生方法调用

内容的提问来源于stack exchange,提问作者jakob witsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:50:41