SceneEditorをレイアウト&に作成することは可能ですか?SKSpriteNodeの複雑なサブクラスを作成し、その情報を読み込み、sksファイルに基づいてシーン内にカスタムオブジェクトを作成します。 ?.sksファイルを使用して複雑なオブジェクトとSKSceneファイルをレイアウトする
私のシナリオでは、ダイアログ上に多くの子を持つポップアップダイアログ(これにはSKSpriteNodesのサブクラス以外)があります。 Scene EditorでSKSceneをレイアウトしたのと同じようにシーンエディタにレイアウトし、必要に応じてシーンに提示することを望んでいました。
私はGameScene.sksファイルにこのオブジェクトを作成することができますが、それらは簡単に乱雑になることがあり、各自のsksファイルを持っていればこれらのダイアログを保存するより良い方法かもしれないと考えました。
私はシーンファイルに似たファイルにアクセスするためにSKSpriteNodeを拡張しようとしましたが、それは
if let teamDialog = SKSpriteNode.spriteWithClassNamed(className: "TeamDialog", fileName: "TeamDialog.sks") { }
extension SKSpriteNode {
static func spriteWithClassNamed(className: String, fileName: String) -> SKSpriteNode? {
guard let dialog = SKSpriteNode(fileNamed: fileName) else {
return nil
}
return dialog
}
}
私はこれが機能するとは思わない。 sksファイルの最上位ノードは常にSKSceneになります。だから、NSKeyedUnarchiverを使用して私はSKSceneとしてファイルを取得することができます、私はこのアーカイブされていないシーンの子SpriteNodeを見つけることができますが、それはすでに親を持っています。シーンにシーンを追加することはできません。 –
あなたは正しいです、シーンにシーンを追加することはできませんが、SKSceneはスーパークラスとしてSKNodeを持っているので、それを使用してこのオブジェクトをSKNodeとして追加することができます。それは私のためにかなりうまく動作します –
私はいくつかの重要な要素やキャストを欠落している必要があります。あなたが提供した関数を使用していて、let wtf = MenuScene.unarchiveNodeFromFile(file: "TeamDialog")の場合に使用しています! SKNodeとして? { addChild(wtf) }シーンに追加するときにエラーが発生する キャッチされない例外のためにアプリを終了しています。 'Cant add body、既にworldに存在します'、理由: 'Cant add bodyタイプ: {名前: 'teamDialogScene'フレーム:{{ - 768、-1024}、{1536、2048}}アンカー:{0.5、0.5}]、既にワールドに存在します –