ar_tourism_flutter_unity/ios/Runner/AppDelegate.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)
}
}