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

如何在SwiftUI视图中展示SpriteKit场景分数 分数不更新如何解决

问题根源

你当前的代码存在两个完全独立的分数变量,二者没有绑定关系,所以视图不会跟随SpriteKit逻辑更新:

  • GameScene文件中定义的全局gameScore变量,是SpriteKit内部分数逻辑实际修改的对象
  • PageTwo视图中定义的@State var gameScore是SwiftUI的局部状态变量,和上述全局变量没有关联,无法感知全局变量的数值变化
解决方案

推荐使用ObservableObject做跨层状态管理,实现SpriteKit和SwiftUI的状态同步:

  1. 首先创建全局游戏状态管理类
import SwiftUI
import Combine

class GameState: ObservableObject {
    // 单例实例,方便跨模块访问
    static let shared = GameState()
    // @Published修饰的属性变化时会自动通知监听者刷新视图
    @Published var score = 0
}
  1. 修改GameScene的分数逻辑,删除原有的全局gameScore变量,所有分数操作改为修改GameState的属性:
// MARK: - Add Score
func addScore(){
    if GameState.shared.score < 250 {
        GameState.shared.score += 1
    } else {
        GameState.shared.score += 2
    }
    scoreLabel.text = String(format: "%06d", GameState.shared.score)
    
    let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]
    if possibleScores.contains(GameState.shared.score) {
        startNewLevel()
    }
}
  1. 修改PageTwo视图,监听GameState的状态变化:
import SwiftUI
import SpriteKit

struct PageTwo: View {
    // 用@StateObject监听可观察对象的变化
    @StateObject private var gameState = GameState.shared

    var body: some View {
        ZStack {
            GameView()
            Text("Score: \(gameState.score)")
                .foregroundColor(.white)
        }
    }
}
可选优化
  • 原代码中possibleScores重复定义了两次,可以抽成全局常量或者GameScene的静态属性,减少冗余
  • 如果不想使用单例,也可以通过构造参数将GameState实例注入到GameScene中,降低模块耦合度

内容的提问来源于stack exchange,提问作者Norbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:04