Когда я добавляю CustomComponent (GKComponent)
к сущности в редакторе сцены Xcode SpriteKit и пытаюсь загрузить этот файл .sks
, используя GKScene.init
, GKScene.rootNode
не устанавливается. Еще более странно, что это происходит только на iOS 13, а не на iOS 12.
У меня есть небольшая настройка проекта github для набора спрайтов, которая наглядно демонстрирует эту проблему. Просто запустите приложение на эмуляторе iOS 13, чтобы воспроизвести проблему. https://github.com/hdsenevi/answers-gkscene-rootnode-nil-bug
Если я удаляю CustomComponent
из объекта / спрайта редактора сцен SpriteKit, то он работает нормально. то есть: загружает SKScene
в GKScene.rootNode
- Существуют ли какие-либо другие специальные изменения, которые должны произойти при добавлении GKComponents из редактора сцен Xcode SpriteKit?
- Я что-то упускаю здесь очевидное?
- И почему этот код будет работать без проблем на iOS 12, а не на iOS 13?
- Изменилась ли функциональность SpriteKit по сравнению с iOS 13?
Для справки
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, такое же поведение)