119 lines
3.7 KiB
Swift
119 lines
3.7 KiB
Swift
import UIKit
|
|
import Flutter
|
|
import UnityFramework
|
|
|
|
@UIApplicationMain
|
|
@objc class AppDelegate: FlutterAppDelegate {
|
|
// Unity控制器引用
|
|
var unityFramework: UnityFramework?
|
|
|
|
override func application(
|
|
_ application: UIApplication,
|
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
) -> Bool {
|
|
// 注册Flutter插件
|
|
GeneratedPluginRegistrant.register(with: self)
|
|
|
|
// 注册Unity插件
|
|
let registry = self.registrar(forPlugin: "UnityPlugin")
|
|
UnityPlugin.register(with: registry)
|
|
|
|
// 初始化Unity框架
|
|
initUnityFramework()
|
|
|
|
// 设置Unity消息处理器
|
|
setupUnityMessageHandlers()
|
|
|
|
// 注册Unity视图工厂
|
|
registerUnityViewFactory()
|
|
|
|
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
}
|
|
|
|
// 初始化Unity框架
|
|
private func initUnityFramework() {
|
|
let unityLoader = UnityFrameworkLoader()
|
|
unityFramework = unityLoader.loadUnityFramework()
|
|
|
|
if unityFramework != nil {
|
|
// 运行Unity
|
|
unityFramework?.setDataBundleId("com.unity3d.framework")
|
|
unityFramework?.register(self)
|
|
unityFramework?.runEmbedded(
|
|
withArgc: CommandLine.argc,
|
|
argv: CommandLine.unsafeArgv,
|
|
appLaunchOpts: nil
|
|
)
|
|
} else {
|
|
print("无法加载Unity框架")
|
|
}
|
|
}
|
|
|
|
// 注册Unity视图工厂
|
|
private func registerUnityViewFactory() {
|
|
let controller = self.window.rootViewController as? FlutterViewController
|
|
if let registrar = controller?.registrar(forPlugin: "UnityPlugin") {
|
|
let factory = UnityViewFactory(registrar: registrar, unityFramework: unityFramework)
|
|
registrar.register(factory, withId: "com.yourcompany.unity_flutter/unityview")
|
|
}
|
|
}
|
|
|
|
// 设置Unity消息处理器
|
|
private func setupUnityMessageHandlers() {
|
|
// 创建Unity通信通道
|
|
let controller = self.window.rootViewController as? FlutterViewController
|
|
let channel = FlutterMethodChannel(name: "com.yourcompany.unity_flutter/unity", binaryMessenger: controller!.binaryMessenger)
|
|
|
|
// 处理Flutter->Unity消息
|
|
channel.setMethodCallHandler { [weak self] (call, result) in
|
|
guard let self = self else { return }
|
|
|
|
switch call.method {
|
|
case "openUnity":
|
|
// 打开Unity视图
|
|
if let args = call.arguments as? [String: Any],
|
|
let sceneName = args["sceneName"] as? String {
|
|
self.openUnityScene(sceneName: sceneName)
|
|
result(true)
|
|
} else {
|
|
result(false)
|
|
}
|
|
case "closeUnity":
|
|
// 关闭Unity视图
|
|
self.closeUnity()
|
|
result(true)
|
|
case "sendMessageToUnity":
|
|
// 向Unity发送消息
|
|
if let args = call.arguments as? [String: Any],
|
|
let gameObject = args["gameObject"] as? String,
|
|
let methodName = args["methodName"] as? String,
|
|
let message = args["message"] as? String {
|
|
self.sendMessageToUnity(gameObject: gameObject, methodName: methodName, message: message)
|
|
result(true)
|
|
} else {
|
|
result(false)
|
|
}
|
|
default:
|
|
result(FlutterMethodNotImplemented)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 打开Unity场景
|
|
private func openUnityScene(sceneName: String) {
|
|
// 向Unity发送加载场景的消息
|
|
sendMessageToUnity(gameObject: "GameManager", methodName: "LoadScene", message: sceneName)
|
|
}
|
|
|
|
// 关闭Unity
|
|
private func closeUnity() {
|
|
unityFramework?.pause(true)
|
|
// 这里可以添加逻辑来隐藏Unity视图
|
|
}
|
|
|
|
// 发送消息到Unity
|
|
private func sendMessageToUnity(gameObject: String, methodName: String, message: String) {
|
|
unityFramework?.sendMessageToGO(withName: gameObject, functionName: methodName, message: message)
|
|
}
|
|
}
|