swift 4.2を使用してSpriteKitフレームワークを作成しており、シーンとアクション用にいくつかの.sksファイルを含めたいと考えています。以下のコードを使用して、バンドルからシーンをロードしようとしました。
class func newGameScene() -> GameScene {
guard let gameScenePath = Bundle(for: self).path(forResource: "GameScene", ofType: "sks") else { assert(false) }
guard let gameSceneData = FileManager.default.contents(atPath: gameScenePath) else { assert(false) }
let gameSceneCoder = NSKeyedUnarchiver(forReadingWith: gameSceneData)
guard let scene = GameScene(coder: gameSceneCoder) else { assert(false) }
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
return scene
}
シーンをロードして提示します。(このコードは、ほとんどがこの問題をテストしているSpriteKit用のAppleのテンプレートからのものです。)
guard let view = view else {
return nil
}
let scene = GameScene.newGameScene()
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
return nil
この場合、GameScene.sksとコードはApplesテンプレートから変更されていません。このコードと.sksアセットは動的フレームワークにあり、別のプロジェクトにインポートされます。
フレームワークにシーンを渡したビューにロードさせると、fpsとノード数は表示されますが、「Hello、World!」は表示されません。テキスト。
同じくテンプレートからコピーされた以下のコードでは、ブレークポイントは、マウスダウン時にこれらが呼び出されないことを示しています。
#if os(OSX)
// Mouse-based event handling
extension GameScene {
override func mouseDown(with event: NSEvent) {
if let label = self.label {
label.run(SKAction.init(named: "Pulse")!, withKey: "fadeInOut")
}
self.makeSpinny(at: event.location(in: self), color: SKColor.green)
}
override func mouseDragged(with event: NSEvent) {
self.makeSpinny(at: event.location(in: self), color: SKColor.blue)
}
override func mouseUp(with event: NSEvent) {
self.makeSpinny(at: event.location(in: self), color: SKColor.red)
}
}
#endif
SpritKitがシーンをロードする方法に関係しているに違いないことはわかっていますが、解決策を見つけることができません。SpritKitの組み込みファイル初期化子のため、NSKeyedUnarchiverを使用する必要があります。
GameScene(fileNamed: "GameScene")
メインバンドルからのみロードされます。
上記では、コーダーを使用してファイルをロードできると仮定しましたが、Tomatoは、sksはコーダーを使用して保存されなかった可能性が高いと指摘しました。その場合、アップルから提供されたapiを使用して、スプライトキット内の別のバンドルからsksファイルをロードできない場合があります。答えにはコーダーが含まれていない場合があります。
私が思っlet gameSceneCoder = NSKeyedUnarchiver(forReadingWith: gameSceneData)
たように、あなたのために適切なコーダーを作成していませんでした。
ただやる
guard let scene = NSKeyedUnarchiver.unarchiveObject(with: gameSceneData) as? SKScene
else{
assert(false)
}
これにより、ファイルが適切にアーカイブ解除されます。
GameSceneを使用する場合は、GameSceneがSKSファイルのカスタムクラスに設定されていることを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加