SpriteView中设置showPhysics、FPS及节点数不生效,如何解决?
问题分析与解决方法
问题原因
这不是bug,是用法有误。你在GameScene的didMove(to:)方法中操作的SKView,并不是SwiftUI SpriteView内部实际用来渲染场景的那个实例。当SpriteView加载你的场景时,会创建自己的SKView托管实例,覆盖你之前在didMove(to:)中做的设置。
解决方法
方法1:使用SpriteView的options参数(推荐)
SpriteView提供了专门的options参数,直接开启FPS、物理调试等显示选项,无需在场景内部操作:
struct ContentView: View { var body: some View { VStack { Text("My Game") // 通过options参数开启需要的显示项 SpriteView(scene: GameScene(), options: [.showsFPS, .showsPhysics]) } .padding() } }
方法2:在场景内部延迟设置
如果一定要在GameScene中配置,可以使用sceneDidLoad()方法(场景加载完成后调用),直接访问场景关联的view属性:
class GameScene: SKScene { override func didMove(to view: SKView) { size = view.frame.size addChild(SKSpriteNode(color: .yellow, size: CGSize(width: 50, height: 50))) } override func sceneDidLoad() { // 确保view已关联后再设置属性 view?.showsFPS = true view?.showsPhysics = true } }
方法3:通过SpriteView的onAppear回调设置
在SwiftUI的onAppear回调中,直接获取场景关联的SKView并修改属性:
struct ContentView: View { // 提前初始化场景实例,方便后续访问 let gameScene = GameScene() var body: some View { VStack { Text("My Game") SpriteView(scene: gameScene) .onAppear { gameScene.view?.showsFPS = true gameScene.view?.showsPhysics = true } } .padding() } }
额外提示
关于场景大小适配:你原来代码中的size = view.frame.size可以替换为在初始化场景时指定大小,或者通过SpriteView的scaleMode参数控制场景的缩放行为,比如:
SpriteView(scene: GameScene(size: CGSize(width: 300, height: 400)), scaleMode: .aspectFit)
内容的提问来源于stack exchange,提问作者rayaantaneja
相关产品推荐
相关产品推荐

