SwiftUI和Unity

Chr*_*ris 8 unity-game-engine swiftui

我试图将Unity视图集成到SwiftUI中,我有以下代码,但是当我运行该应用程序时,我没有任何输出,我知道SpriteKit和SceneKit是可能的,并且我的统一视图运行在标准的swift应用程序中,想知道swiftUI是否可能。

struct ContentView: View {
    var body: some View {
      UnityUIView()
  }
}

struct UnityUIView : UIViewRepresentable {

    func makeUIView(context: Context) -> UIView {
        let appDelegate = UIApplication.shared.delegate as? AppDelegate
        appDelegate.startUnity()
        return UnityGetGLView()!
    }

    func updateUIView(_ view: UIView, context: Context) {

    }
}
Run Code Online (Sandbox Code Playgroud)

我试图创建一个UIViewControllerRepresentable,但得到的结果是一样的,屏幕闪烁一次然后消失,我认为这是启动屏幕,因为我更改了调试颜色,没有骰子。

struct ContentView: View {
    var body: some View {
      TestUnityViewController()
  }
}

struct TestUnityViewController: UIViewControllerRepresentable {

  func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.startUnity()
    let unityView = UnityGetGLView()!
    vc.view.backgroundColor = .red
    vc.view!.addSubview(unityView)

    return vc
  }

  func updateUIViewController(_ viewController: UIViewController, context: Context) {

  }
}
Run Code Online (Sandbox Code Playgroud)

如果我将延迟添加到UIViewControllerRepresentable,它将起作用。

    struct TestUnityViewController: UIViewControllerRepresentable {

  func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()

    vc.view.backgroundColor = .red


    DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.startUnity()
        let unityView = UnityGetGLView()!
      vc.view!.addSubview(unityView)
    }

    return vc
  }

  func updateUIViewController(_ viewController: UIViewController, context: Context) {

  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*cho 1

对于仍然遇到问题的人。我还没有调查过,但如果您使用新的Unity 示例将 Unity 集成为框架,那么延迟确实解决了 SwiftUI 的问题。

您可以创建一个 SwiftUI,View将 Unity 视图添加到其中:

import SwiftUI

struct TestUnityViewController: UIViewControllerRepresentable {

  func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()
    
    UnityBridge.showUnity()
    DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
        let unityView = UnityBridge.getAppController().rootView!
        vc.view!.addSubview(unityView)
    }
    return vc
  }

  func updateUIViewController(_ viewController: UIViewController, context: Context) {}
}

struct ContentView: View {
    
    var body: some View {
        TestUnityViewController()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

这里UnityBridge是 Unity 框架实例化的包装器,类似于存储库中的 Objective C 版本。

方法:

  • showUnity()创建UnityFramework实例,然后调用showUnityWindow方法
  • getAppControllerappController从 UnityFramework 对象调用方法

同时我找到了更好的解决方案,这样就可以了。我想有一个更好的方法可以做到这一点,也许触发一个事件来知道 Unity 的视图何时完全准备好。

编辑:

我创建了一个示例存储库来展示如何将 Unity 集成到 SwiftUI 项目中:https://github.com/DavidPeicho/unity-swiftui-example