Unity3d 新场景下的统一调用方法
我有一个有很多场景的游戏,我加载它们,然后不破坏它们,所以我保持它们(第一次醒来/开始打电话) 假设我们有以下状态更改-菜单->游戏->游戏结束->菜单->游戏 我想在每次显示场景时调用一个方法来重置/设置一些值 最干净的方法是什么?目前我使用的是update方法,但这需要很多行,而且在不需要的时候在每个脚本中使用update()是浪费时间的。根据多场景编辑,建议避免DontDestroyOnLoad 建议避免使用Unity3d 新场景下的统一调用方法,unity3d,Unity3d,我有一个有很多场景的游戏,我加载它们,然后不破坏它们,所以我保持它们(第一次醒来/开始打电话) 假设我们有以下状态更改-菜单->游戏->游戏结束->菜单->游戏 我想在每次显示场景时调用一个方法来重置/设置一些值 最干净的方法是什么?目前我使用的是update方法,但这需要很多行,而且在不需要的时候在每个脚本中使用update()是浪费时间的。根据多场景编辑,建议避免DontDestroyOnLoad 建议避免使用DontDestroyOnLoad持久化管理器 您希望在场景负载中生存的游戏对象。
DontDestroyOnLoad
持久化管理器
您希望在场景负载中生存的游戏对象。相反
创建一个包含所有管理者和用户的管理者场景
SceneManager.LoadScene(,LoadSceneMode.additional)
和
SceneManager.UnloadScene
管理游戏进度
因此,在您的情况下,您可以通过多种方式处理重置数据。但一种简单的方法是从“管理器”场景中的组件检查刚刚加载的场景的名称。例如,BaseSecene中的MySceneManager。在下面的代码中,我们使用了SceneManager
的sceneLoaded
委托
using UnityEngine;
using UnityEngine.SceneManagement;
public class MySceneManager : MonoBehaviour
{
void OnEnable ( ) => SceneManager.sceneLoaded += OnSceneLoaded;
void OnSceneLoaded ( Scene scene, LoadSceneMode mode )
{
switch ( scene.name.ToLower ( ) )
{
case "menu":
// Do some "menu" initialisation here...
break;
case "game":
// Do some "game" initialisation here...
break;
case "gameover":
// Do some "gameover" initialisation here...
break;
}
}
void OnDisable ( ) => SceneManager.sceneLoaded -= OnSceneLoaded;
}
注意:不幸的是,此方法不会对场景名称进行编译时检查,因此您必须小心确保场景名称与切换案例相对应
但是,要记住的另一件事是,新加载场景中的任何组件都将调用Awake()
,因此您可以将所有场景初始化卸载到每个场景中的组件。这将使MySceneManager与每个场景中的数据分离
所以,你有很多选择,这只是其中的两个。“最佳”选项将是您满意的选项,并且适合您的需要。考虑添加一些示例代码。您不能对场景对象调用
DoNotDestroy
。我猜你的意思是,你是在一个游戏对象上做这件事的,它附带了一些脚本。在任何情况下,在代码的某个地方调用LoadScene
,只需在从未销毁的对象上调用ResetValues()
方法。是的,我在Awake()中完成所有操作,但是当我第二次加载场景时,我必须重置一些值,尽管MonoBehavior中有一个方法调用它,但没有。但不管怎么说,你刚才给我看的方式实际上是完美的!我在使用libGDX时就是这样做的。