Когда я добавляю 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 Мохаве 10.14.6
- Xcode 11.0 (пробовал на 10.1 и 10.3, такое же поведение)
build
2) удалил папкуderived data
3) сбросил симуляторы iOS 12 и 13 4) попробовал разные симуляторы устройств (6, 8, X, 11). Вы можете попробовать это сами, просто просмотрев репозиторий, который я упомянул в вопросе, и запустив этот образец проекта на симуляторе iOS 12 и iOS 13. Даже iOS 13 работает, если вы удалитеCustomComponent
, прикрепленный к узлуred sprite
в файлеGameScene.sks
. Но очевидно хотелось бы прикрепить компоненты из редактора сцен SpriteKit. - person hdsenevi   schedule 07.10.2019