如何在SwiftUI视图中展示SpriteKit场景分数 分数不更新如何解决
问题根源
你当前的代码存在两个完全独立的分数变量,二者没有绑定关系,所以视图不会跟随SpriteKit逻辑更新:
- GameScene文件中定义的全局
gameScore变量,是SpriteKit内部分数逻辑实际修改的对象 - PageTwo视图中定义的
@State var gameScore是SwiftUI的局部状态变量,和上述全局变量没有关联,无法感知全局变量的数值变化
解决方案
推荐使用ObservableObject做跨层状态管理,实现SpriteKit和SwiftUI的状态同步:
- 首先创建全局游戏状态管理类
import SwiftUI import Combine class GameState: ObservableObject { // 单例实例,方便跨模块访问 static let shared = GameState() // @Published修饰的属性变化时会自动通知监听者刷新视图 @Published var score = 0 }
- 修改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() } }
- 修改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
相关产品推荐
相关产品推荐

