SpriteKit结合SwiftUI开发时点击UI按钮调用GameScene方法添加精灵不生效
问题原因
- 你声明的
scene是计算属性,每次访问这个属性都会生成一个全新的GameScene实例,SpriteView渲染的实例和你后续操作的实例根本不是同一个 - 按钮点击逻辑里又额外创建了一个全新的
GameScene实例makeBall,这个实例没有被挂载到任何SpriteView上,添加的节点自然不会显示在当前渲染的场景里
修复方案
- 将
GameScene实例改为存储属性,保证全局只有一个被渲染的实例 - 按钮点击时直接调用这个已存在实例的
ball()方法即可
修复后完整代码:
import SwiftUI import SpriteKit class GameScene: SKScene { override func didMove(to view: SKView) { physicsBody = SKPhysicsBody(edgeLoopFrom: frame) } func ball() { let ball = SKShapeNode(circleOfRadius: 30) ball.position = CGPoint(x: 100, y: 100) ball.fillColor = .blue self.addChild(ball) } } struct ContentView: View { // 改为存储属性,仅初始化一次 @State private var gameScene: GameScene = { let scene = GameScene() scene.size = CGSize(width: 800, height: 930) scene.scaleMode = .fill scene.backgroundColor = .red return scene }() var body: some View { VStack { HStack { Button { // 直接调用当前渲染的场景实例方法 gameScene.ball() print("Image tapped!") } label: { Image("playButton") } Button { print("Image tapped!") } label: { Image("pauseButton") } } SpriteView(scene: gameScene) .frame(width: 800, height: 930, alignment: .center) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
内容的提问来源于stack exchange,提问作者Waterboy
相关产品推荐
相关产品推荐

