You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpriteKit结合SwiftUI开发时点击UI按钮调用GameScene方法添加精灵不生效

问题原因

  • 你声明的scene是计算属性,每次访问这个属性都会生成一个全新的GameScene实例,SpriteView渲染的实例和你后续操作的实例根本不是同一个
  • 按钮点击逻辑里又额外创建了一个全新的GameScene实例makeBall,这个实例没有被挂载到任何SpriteView上,添加的节点自然不会显示在当前渲染的场景里

修复方案

  1. 将GameScene实例改为存储属性,保证全局只有一个被渲染的实例
  2. 按钮点击时直接调用这个已存在实例的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:24:00