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)
对于仍然遇到问题的人。我还没有调查过,但如果您使用新的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
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |