gpt4 book ai didi

swift - 在 Xcode SpriteKit 场景编辑器中向实体添加自定义 GKComponent 将 GKScene.rootNode 设置为 nil

转载 作者:行者123 更新时间:2023-11-28 13:26:41 24 4
gpt4 key购买 nike

当我将 CustomComponent (GKComponent) 添加到 Xcode SpriteKit 场景编辑器中的实体并尝试使用 GKScene.init< 加载该 .sks 文件时GKScene.rootNode 未设置。更奇怪的是,这只发生在 iOS 13 而不是 iOS 12。

我有一个小型 sprite 工具包 github 项目设置,清楚地演示了这个问题。只需在 iOS 13 模拟器上运行该应用程序即可重现该问题。 https://github.com/hdsenevi/answers-gkscene-rootnode-nil-bug

如果我从 SpriteKit 场景编辑器实体/ Sprite 中删除 CustomComponent,那么它运行良好。即:加载 SKSceneGKScene.rootNode

  1. 从 Xcode SpriteKit 场景编辑器添加 GKComponents 时是否需要进行任何其他特殊修改?
  2. 我是否遗漏了一些明显的东西?
  3. 为什么这段代码可以在 iOS 12 而不是 iOS 13 上正常运行?
  4. 在 iOS 13 中,SpriteKit 功能是否针对此进行了更改?

供引用

import UIKit
import SpriteKit
import GameplayKit

class GameViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// Load 'GameScene.sks' as a GKScene. This provides gameplay related content
// including entities and graphs.
if let scene = GKScene(fileNamed: "GameScene") {

// Get the SKScene from the loaded GKScene
if let sceneNode = scene.rootNode as! GameScene? {

// Copy gameplay related content over to the scene
sceneNode.entities = scene.entities
sceneNode.graphs = scene.graphs

// Set the scale mode to scale to fit the window
sceneNode.scaleMode = .aspectFill

// Present the scene
if let view = self.view as! SKView? {
view.presentScene(sceneNode)

view.ignoresSiblingOrder = true

view.showsFPS = true
view.showsNodeCount = true
}
} else {
print("Error. No GameScene was found on GKScene.rootNode")
}
} else {
print("Error loading GKScene file GameScene")
}
}
}
import SpriteKit
import GameplayKit

class CustomComponent: GKComponent {
override init() {
super.init()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override func didAddToEntity() {
guard let gkSkNodeComponent = self.entity?.component(ofType: GKSKNodeComponent.self) else {
print("Error. Cannot obtain a reference to GKSKNodeComponent")
return
}

if let sprite = gkSkNodeComponent.node as? SKSpriteNode {
sprite.texture?.filteringMode = .nearest
}
}
}

更新

关于我的设置的一些细节

  • macOS Mojave 10.14.6
  • Xcode 11.0(在 10.1 和 10.3 上试过,行为相同)

最佳答案

要解决此问题,您的组件需要覆盖变量 supportsSecureCoding 并且它必须返回 true。

这对我有用:

override class var supportsSecureCoding: Bool {
return true
}

关于swift - 在 Xcode SpriteKit 场景编辑器中向实体添加自定义 GKComponent 将 GKScene.rootNode 设置为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com