Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SceneKit游戏的架构,菜单屏幕的多视图控制器?_Ios_Swift_Uikit_State_Scenekit - Fatal编程技术网

Ios SceneKit游戏的架构,菜单屏幕的多视图控制器?

Ios SceneKit游戏的架构,菜单屏幕的多视图控制器?,ios,swift,uikit,state,scenekit,Ios,Swift,Uikit,State,Scenekit,我正在使用Swift开发一个SceneKit游戏,我正在考虑如何最好地组织实际主游戏场景周围的各种屏幕/状态。我有一个简单的原型,它由三个状态组成: 启动屏幕(选择游戏类型)-> 游戏-> 屏幕上的游戏(选择再次玩或返回splash) 在原型中,我选择使用UIKit来完成UI元素,而不是SpriteKit覆盖。虽然现在只是按钮,这在SpriteKit中很容易做到,但我将来可能会想添加滑块(例如设置控件灵敏度的选项屏幕)、文本输入等,然后重新创建大量uikit 因此,目前,上述3个场景中的每一

我正在使用Swift开发一个SceneKit游戏,我正在考虑如何最好地组织实际主游戏场景周围的各种屏幕/状态。我有一个简单的原型,它由三个状态组成:

  • 启动屏幕(选择游戏类型)->
  • 游戏->
  • 屏幕上的游戏(选择再次玩或返回splash)
在原型中,我选择使用UIKit来完成UI元素,而不是SpriteKit覆盖。虽然现在只是按钮,这在SpriteKit中很容易做到,但我将来可能会想添加滑块(例如设置控件灵敏度的选项屏幕)、文本输入等,然后重新创建大量uikit

因此,目前,上述3个场景中的每一个都有自己的
UIViewController
。Splash和Game ViewController都有自己的
SCNView
s和
SCNScene
s,GameOver是一种显示在主游戏场景上的模式

这种结构并不理想,因为它意味着每当
GameViewController
viewDidLoad
触发时,主游戏SCNScene就会重新加载。主
SCNScene
非常详细,因此需要几秒钟的时间来加载,重复循环似乎会造成内存问题。经过两个周期的Splash->Game->GameOver后,我收到一个内存警告,第三个周期后,Xcode失去了与iPhone的连接(根据我的经验,这似乎是由内存问题引起的)

我希望有一个主
GameViewController
,可以加载最频繁重用的资产一次,但仍然能够在各种菜单屏幕之间切换

那么这里有什么选择呢

我想也许我可以拥有一个主
GameViewController
,它控制SceneKit资产的加载和卸载,并拥有唯一的
SCNView
。当应用程序第一次启动时,它的
viewDidLoad
方法只会触发一次。然后,其他每个视图都会有一个非常小的
UIViewController
,它将作为modals显示在主GameViewController上,并选择“OverCurrentContext”


我想问一下这种模式听起来是否可行,以及其他人是如何组织他们的SceneKit游戏的。我对本机iOS开发还很陌生,所以可能是我缺少一些基本的游戏设计模式。

我只使用一个GameViewController的经验(我目前在MAC OS X上的工作:我开始了一个“小”3D游戏,有一个主菜单/开始屏幕、一个Hud和2或3个完全不同的3D场景——这也将被移植到IOS上):

在上周,我尝试了你要求的方法,只使用一个GameViewController来处理“所有”这些东西——对我来说,这似乎是一种简单而“好”的方法——但即使在过去几年我学会了很多技巧之后,我仍然无法重新加载(或更改)另一个3D场景(甚至无法加载另一个精灵套件场景hud)在单个ViewController中加载scenekit场景后。 也许MAC OS X和IOS之间有区别,但我甚至在IOS版本中尝试过,它有相同的行为


我能做的是:你可以修改加载的3D场景或更改sprite kit hud中的数据等,这样你就可以在需要的时候使用一个3D场景来添加或显示东西,但就我在这里的测试所示,你需要一个ViewController来显示一个全新的3D场景或2d/3D菜单等。我将发布我的进一步体验只要我再往前走一步,我就会与您保持友好关系。我希望这会有所帮助。

谢谢您的尝试。有趣的是,您无法将新场景加载到视图中。您尝试过吗?“使用此方法通过动画过渡更改SceneKit视图(或其他渲染器)中显示的场景。”