【发布时间】:2021-08-20 04:39:57
【问题描述】:
也许我没有正确理解 UIViewRepresentable,但我认为这会起作用。
我正在尝试使用两个 UIViewRepresentable 类在 SwiftUI 中显示我的 scnkit 场景。我还为这些类使用了两种协调器方法,各一种。协调器可以访问当前场景的渲染和物理世界方法。
玩家在第一个场景中生成,当与敌人接触时,它会过渡到第二个场景。 问题从这里开始,它没有让第二个协调器处理第二个类的物理世界和渲染方法。
我相信这是因为即使场景发生变化,我仍在使用 swiftui 中的第一类而不是第二类。或者换句话说,我正在改变场景而不是正在使用的类。
问题:我怎样才能从第一个场景过渡到第二个场景和/或从第一个场景过渡到另一个场景,并且仍然让协调器为每个场景都处于活动状态。
这是第一堂课。
struct FirstClass : UIViewRepresentable {
var view = SCNView()
var scene = SCNScene(named: "First.scn")!
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> SCNView {
scene.physicsWorld.contactDelegate = context.coordinator
view.delegate = context.coordinator
return view
}
...
/// Transitions into the second scene.
func changeScenes() {
controlManager.jumped = false
let transition = SKTransition.fade(with: .black, duration: 0.5)
let secondClass = SecondClass()
view.present(secondClass.scene, with: transition, incomingPointOfView: nil)
}
}
这是第二课
struct SecondClass : UIViewRepresentable {
var view = SCNView()
var scene = SCNScene(named: "Second.scn")!
func makeCoordinator() -> SecondCoordinator {
SecondCoordinator(self)
}
func makeUIView(context: Context) -> SCNView {
scene.physicsWorld.contactDelegate = context.coordinator
view.delegate = context.coordinator
return view
}
}
这里是 SwiftUI 类
struct Game: View {
var view = FirstClass()
var body: some View {
ZStack {
view
...
}
}
}
【问题讨论】:
-
你似乎没有使用
SecondClass的view属性,你需要第二个SCNView,还是只是为了应付UIViewRepresentable? -
我将使用它转换回第一个场景。
-
但我假设你只会使用场景,对吧?视图将保持不变。
-
我还使用视图/场景将其委托设置为相应的协调器。这样它就会有自己的物理世界和渲染方法。
-
那么你可能使用了错误的抽象:)
标签: swift swiftui scenekit uiviewrepresentable