每次我的应用程序进入后台然后再次激活时,SpriteView 总是会重置并且 SKScene 会返回到关卡的开头。我怎样才能阻止这个或者我做错了什么?
我的代码:
struct GameContainer: View {
private var scene: SKScene {
let scene = Splash()
scene.size = Size.shared.setupSceneSize()
scene.scaleMode = .aspectFit
return scene
}
var body: some View {
SpriteView(scene: scene, options: .ignoresSiblingOrder)
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)
}
}
struct Game: View {
...
var body: some View {
NavigationView {
ZStack {
GameContainer()
....
更新:
struct GameContainer: View {
static var scene = Splash()
var body: some View {
SpriteView(scene: GameContainer.scene, options: .ignoresSiblingOrder)
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)
}
}
class Splash: SKScene {
override init() {
super.init(size: Size.shared.setupSceneSize())
scaleMode = .aspectFit
}
....
}
尝试设置场景inside
Splash()
的大小和缩放模式,然后使scene
静态。我认为这应该可以解决 SpriteView 一直重新加载的问题。
struct GameContainer: View {
static var scene = Splash()
var body: some View {
SpriteView(scene: GameContainer.scene, options: .ignoresSiblingOrder)
.ignoresSafeArea()
.statusBar(hidden: true)
}
}
struct Game: View {
...
var body: some View {
NavigationView {
ZStack {
GameContainer()
....
在重新审视这个问题并尝试不同的解决方案(包括 West1 的答案及其变体)之后,我得出的结论是用 UIViewRepresentable 替换 SpriteView。
struct GameContainer: UIViewRepresentable {
func makeUIView(context: Context) -> SKView {
let view = SKView()
view.ignoresSiblingOrder = true
view.allowsTransparency = true
let scene = SKScene(fileNamed: "Splash")!
view.presentScene(scene)
return view
}
func updateUIView(_ uiView: SKView, context: Context) {}
}
问题在于,只要玩家更改配色方案或离开应用程序,SpriteView 就会更新。如果这种情况发生在游戏中期,它可以软锁定玩家或重新启动关卡。
UIViewRepresentable 似乎没有这个问题。
注意:我使用的是没有协调器的 UIViewRepresentable 版本。协调器是与 SwiftUI 和视图进行通信所需要的。我不确定如果有协调员的话它是否会继续工作。