c# - 使用 DontDestroyOnLoad 调用场景加载方法
问题描述
我正在使用带有 DontDestroyOnLoad() 的 GameObject 来存储玩家数据和场景之间的转换。有没有办法让它在场景改变时调用 Start() 或等效方法(在新场景中填充玩家数据)或者我需要在每个场景中放置一个实用程序对象来调用适当的设置方法它自己的 Start()
解决方案
您可以使用例如SceneManager.sceneLoaded
并附加回调,例如
void Awake()
{
DontDestroyOnLoad (gameObject);
SceneManager.sceneLoaded += OnSceneLoaded;
}
// called second
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
// Find your player and populate the data like e.g.
var player = FindObjectOfType<Player>();
player.SetData(....);
}
private void OnDestroy ()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
当然,您也可以反过来,简单地让您的播放器获取您提到自己的数据
public class Player : MonoBehaviour
{
private void Start ()
{
var manager = FindObjectOfType<PlayerManager>();
var data = manager.GetData();
...
}
}
在这种情况下,虽然问题是为什么还要打扰DontDestroyOnLoad
它,它必须是一个MonoBehaviour
吗?
你也可以简单地让你的数据容器static
像
public static class PlayerData
{
public static int someValue = 5;
}
并让您的播放器像访问它们一样
if(PlayersData.someValue <= 0)
{
PlayerData.someValue = 10;
}
有关更多选项,请参阅如何在 Unity 中的场景之间传递数据
推荐阅读
- git - 配置 git 不使用“.gitignore”,而是使用“gitignore”
- python - 使用 PyDrive 将文件上传到 Google-drive Teamdrive 文件夹
- java - Springboot 不起作用,除非输入 hello
- cygwin - 在 Cygwin 上构建 opnMPI
- android - Android Studio 模拟器:进程以退出代码 3 结束
- c# - 将 wsdl 文件导入 C# WCF 项目,并公开 wsdl 合同
- javascript - 反应:在 Div 上设置 scrollTop 在特定情况下不起作用
- android - 如何在圆形 ProgessBar 内覆盖 imageView
- c# - SqlException:无效的对象名称“产品”。处于生产模式但处于开发模式时
- hive - Parquet 二进制 UTF8 作为 hive 上的字符串