Я пытался создать подкласс SCNScene, так как это кажется лучшим местом для хранения логики, связанной со сценой. Теперь я не уверен, рекомендуется ли это, поэтому мой первый вопрос: должен ли я создавать подклассы SCNScene, а если нет, то почему? Кажется, в документации предполагается, что это распространено, но я читал комментарии в Интернете, в которых предлагалось не создавать подклассы. Забудьте об этом, я просматривал документацию для SKScene
. Ссылка на класс SCNScene
не упоминает о подклассах.
Предполагая, что можно структурировать мою игру таким образом, вот мой прогресс
// GameScene.swift
import Foundation
import SceneKit
class GameScene: SCNScene {
lazy var enityManager: BREntityManager = {
return BREntityManager(scene: self)
}()
override init() {
print("GameScene init")
super.init()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func someMethod() {
// Here's where I plan to setup the GameplayKit stuff
// for the scene
print("someMethod called")
}
}
Примечание. Я использую lazy var
в соответствии с ответом на этот вопрос а>
В моем контроллере представления я пытаюсь использовать GameScene следующим образом.
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// create a new scene
let scene = GameScene(named: "art.scnassets/game.scn")!
// retrieve the SCNView
let scnView = self.view as! SCNView
// set the scene to the view
scnView.scene = scene
// Should print "someMethod called"
scene.someMethod()
}
}
Однако вызов GameScene.someMethod()
вызывает ошибку EXEC_BAD_ACCESS
.
Кроме того, если я опускаю вызов GameScene.someMethod
, сцена загружается правильно, но переопределенный инициализатор в GameScene
не вызывается.
Я не уверен, что здесь происходит. Понятно, что в подклассах в Swift есть что-то, чего я не понял. Или, возможно, есть какой-то аспект порядка, в котором вещи должны работать, который я упустил.