Swift 从SKScene中切换并返回,使游戏;冻结“;

Swift 从SKScene中切换并返回,使游戏;冻结“;,swift,sprite-kit,segue,Swift,Sprite Kit,Segue,我正在开发一款具有两种不同场景的SpriteKit游戏(MainMenu.sks和Settings.sks)。我还有一个UIViewController 从主菜单中,用户可以点击“设置”,这会导致应用程序加载Settings.sks场景并显示它 它是使用以下代码完成的: // Move to Settings.sks let transition = SKTransition.flipVertical(withDuration: 1.0) let

我正在开发一款具有两种不同场景的SpriteKit游戏(MainMenu.sks和Settings.sks)。我还有一个UIViewController

从主菜单中,用户可以点击“设置”,这会导致应用程序加载Settings.sks场景并显示它

它是使用以下代码完成的:

// Move to Settings.sks
            let transition = SKTransition.flipVertical(withDuration: 1.0)
            let loadScene = SettingsScene(fileNamed: "SettingsScene")
            loadScene?.scaleMode = self.scaleMode
            self.view?.presentScene(loadScene!, transition: transition)
从Settings.sks场景中,用户可以点击SKLabelNode“更改用户名”,这会导致应用程序通过执行一个segue来加载UIViewController

UIViewController包含一个UIExtField和一个UIButton。UIButton将用户带回MainMenu.sks

然而,当我这样做的时候,它就像主菜单的一个新场景被放置在另一个主菜单上,导致应用程序有点“冻结”,并且不响应任何触摸手势。我可以从nodeCount中看到节点数是原来的两倍

解决方法是直接从MainMenu.sks(也通过segue)加载UIViewController。通过这样做,该应用程序运行良好

我怀疑问题在于加载Settings.sks的方式


我错过了什么?可能在退出前卸载整个SKView

执行序列将在堆栈顶部显示一个新视图。通过使用segue返回主菜单,应用程序将在UIViewController的顶部创建一个新的主菜单。我不能确定你的应用程序为什么会冻结。但我猜,当从UIViewController创建并显示新的主菜单时,有些属性或函数无法正常工作

我建议将用于到达UIViewController的segue展开。这样可以返回到上一个视图并节省内存

您需要在destination视图中编写iAction,在本例中,主菜单为:

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
}
然后按住ctrl键将UIViewController中的按钮拖动到情节提要中的退出图标。您应该看到一个选项,可以使用您刚刚编写的iAction
unwindToMainMenu
。这将创建一个展开段


在这个答案中可以找到一个完整的解绕步骤指南和多个示例:

从它的声音来看,我认为您可能对UIViewController顶部显示的新主菜单是正确的。你能将UIViewController中的代码发布到主菜单吗?当发生转换时,两个场景都将存在。IIRC的工作原理是,旧场景成为新场景“幕后”的子节点,以允许对两者进行更新。我要做的第一件事是在没有过渡的情况下让一切正常工作,并确保场景没有任何导致它们保持活动状态的保留周期。@guardworkingelsepanic-我也怀疑这一点。我的代码只是一个简单的序列:
//退出查看self.performsgue(带有标识符:“saveAndReturnToGame”,发件人:self)
这正是我要找的!随着赛格的展开,它就像一个符咒。真不敢相信我没有偶然发现。非常感谢你。