TLTR:デバッグなぜSKSceneの初期化(ゼロfileNamed :)戻り
問題:SKScene
サブクラスのinit(fileNamed:)
戻りnil
理由:.sks
ファイルが第二初期化の時点で存在していませんコール。何とかODRの実装AND/OR動作に関係する問題です。
説明:
SpriteKit
で構築されたゲーム。私のSKScene
サブクラスのinit(fileNamed:)
はnil
を返します。私は「なぜ」を理解しようとしています。そしてどうやって?"この問題をデバッグします。
SKScene
サブクラス初期化するための私のコード:注意すべき
/// the hierarchy: SKScene -> TBTBaseScene -> TBTLevelScene
let sceneType: TBTBaseScene.Type = TBTLevelScene.self
let fileName = "Level1"
let scene = sceneType.init(fileNamed: fileName)
いくつかのこと:
- このコードは、実行中のある時点で動作しますが、他ではありません。
- ターゲットがXcode経由でビルドされている場合、[製品] - > AppName.appに移動し、[Finderで表示]を右クリックし、
Level1.sks
はありません。アプリはODRを使用し、Level1.sks
が、それはブレークポイントがlet sceneType:...
ラインに設定されている場合、私は簡単にを介して他のゲームシーンを - を作成することができ初期インストールのタグであっても、「レベル1」のタグが付いているので、おそらくそれは、OKですそれぞれのサブクラスとファイル名は
expression TBTLevelScene(fileName:"Level1")
、戻り値はnil
です。 - メインバンドルに
Level1.sks
があるかどうかを確認しようとしましたが、以下のコードでは、すべてのシーンで常に「ファイルが使用できません」と表示されているため、アプローチが間違っているようです。 - シーンロードのためのゲームのアーキテクチャは、DemoBots Sample Codeから駆動されます。
LoadSceneOperation.swift
でも同様のアプローチが見られます。しかし、初期化はすべての場合にうまく機能します。
私はthis answerに基づいて存在する "レベル1" または "Level1.sks" を、チェックするために使用するコード:
let path = NSBundle.mainBundle().bundlePath
let url = NSURL(fileURLWithPath: path)
let filePath = url.URLByAppendingPathComponent(fileName).absoluteString
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(filePath) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
UPDATE:Michael Dautermannが提供するファイルをチェックするための
アプローチ理由を証明します:Level1.sks
はではありません。は2回目の読み込み中に存在します。
プロジェクトのLevel1.sks
ファイルが「バンドルリソースのコピー」領域に追加され、「レベル1」のODRタグがあります。このタグは初期インストールタグプリフェッチグループにあります。
ORDの実装にはいくつかのバグがあります。必要でないときにリソース(Level1.sks
)を廃棄し、必要なときに再度ロードしません。私はそれを理解するために移動し続けます。
ファイルの存在を確認するアプローチが有効です。アプリがクラッシュしたときに「Level1.sks」が利用できないことを示しています。ただし、 "バンドルリソースのコピー"領域*には "Level1.sks"があります。 –
ファイルがビルド済みのアプリケーションにコピーされていないことが何らかの理由である必要があります。ビルドログには何か有用なものはありますか? ( "show all messages") –
私の更新を見てください。あなたのコードは、ケースを絞り込むのに役立ちました。ありがとう。 @Michael Dautermann –