本文将对初学者游戏开发人员很有用。 在其中,我将谈谈自己在实现多阶段交互方面的经验以及遇到的问题。
让我们谈谈用于存储数据的静态类,使用Unity引擎加载场景的各种方法,并讨论将Admob连接到项目的情况。 官方文档和友好的开发人员社区提供的信息。
情况
我的游戏包含两个场景-主菜单(在加载后立即可见)和具有机械性的游戏场景,根据所选选项,将对象的预制件加载到其中。 我无法将它们组合到一个场景中,因为将几个相当复杂的对象绑定到菜单上,并且更方便地分离实体。
以前,我只是使用某个控制器对象来存储数据,但是随着场景的卸载,它不再存在。
数据传输(静态类)
事实证明,即使Unity代码和平地位于scripts文件夹中的文件中,并且没有被组件附加到舞台上的对象上,它也擅长使用代码(这对于初学者而言并不明显)。 例如,这样的文件可以是这种静态类:
using UnityEngine; public static class DataHolder { private static GameObject prefabName; public static GameObject Prefab { get { return prefabName; } set { prefabName = value; } } }
因此,即使在卸载场景并加载新场景后,我仍设法保存了用户的选择。 最初,所有情况都适用于硬切换场景。
使用此机制,您还可以从菜单将设置传输到其他场景,例如,本地化语言,声音和音乐的设置等。
多值(场景管理)
一切都适合我,直到我收到连接到Admob项目(广告)的任务,这样视频才在游戏场景的开始处显示。 事实证明,这有一些微妙之处:请求视频需要花费大量时间,并且切换场景时没有时间到达。 我不想延迟项目的其他延迟,尤其是因为我们有很多时间直到播放器“粘在”菜单上。 然后,我发现无需“硬”切换场景,因为有一个很好的选项可用于加性加载(无需卸载先前的场景)。
我使用菜单控制器加载游戏场景(具有菜单和广告对象的场景也保持加载状态):
SceneManager.LoadScene(1,LoadSceneMode.Additive);
关卡完成后,我使用游戏控制器卸载游戏场景(这样它就不会挂在我的内存中):
SceneManager.LoadScene(0,LoadSceneMode.Single);
使用这种方案,广告将在应用程序启动时立即加载,您可以在任何期望的时间调用广告的显示。 您可以对所需的任何对象执行相同的操作。
问题所在
不幸的是,即使添加了场景,您也将无法从另一个场景深入研究一个场景的对象。 指向对象的链接将必须通过某个“中介”进行传输(在我的情况下,使用的是相同的静态类)。
实例化预制件时要小心,如果有几个场景处于活动状态-对我而言,它们都决定撞到错误的场景(这是另一次)。