Добавление пользовательского GKComponent к сущности в редакторе сцены Xcode SpriteKit устанавливает GKScene.rootNode в ноль - PullRequest
0 голосов
/ 05 октября 2019

Когда я добавляю 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

  1. Существуют ли какие-либо другие специальные изменения, которые должны произойти при добавлении GKComponents из редактора сцен Xcode SpriteKit?
  2. Я что-то упускаю здесь очевидное?
  3. И почему этот код будет работать без проблем на iOS 12, а не на iOS 13?
  4. Изменилась ли функциональность 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, такое же поведение)

1 Ответ

1 голос
/ 27 октября 2019

Я также только что натолкнулся на это и отправил Отзыв с ссылкой на эту статью, так как это отличное описание проблемы.

...