Unity场景(Scene)之间传递数据
假设游戏中有SceneA和SceneB两个场景,想要从SceneA跳转到SceneB时需要传递数据,起初还以为SceneManager.LoadScene应该能像安卓开发⼀样(intent)挂个数据就⾏,但很快我发现我想多了,SceneManager没有传递参数选项。
从冰箱拿⼀瓶82年的可乐边喝边看Unity官⽹⽂档后到解决⽅案了。
1)新建⼀个脚本(假设叫GameData)代码如下:
public class GameData : MonoBehaviour
{
public int param;
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
}
2) 在SceneA上新建⼀个EmptyObject(假设名叫GameData,这个名称随便,我为了⽅便就⽤了跟脚本⽂件同名的),然后把刚才的脚本挂上去。
3)在SceneA上SceneManager.LoadScene之前给GameData赋值:
GameObject.Find("GameData").GetComponent<GameData>().param = 12313213;
SceneManager.LoadScene("SceneBScene");安卓intent用法
4)在SceneB的start函数中⽤下⾯的⽅式获取我们的数据:
private void Start()
{
int param = GameObject.Find("GameData").GetComponent<GameData>().param;
// Debug.Log(param); 测试传值是否成功
}
好了~⽅法就是上⾯的⽅法,下⾯咱聊聊原理吧!
其实所有的关键就是GameData脚本中的
DontDestroyOnLoad(transform.gameObject);
因为Unity跳转场景时会销毁上⼀个场景⾥的所有游戏对象,但你在游戏对象上挂了带有DontDestroyOnLoad这⼀⾏的脚本时,Unity会把这个游戏对象保留下来不会销毁!下⼀个场景运⾏的时候在Hierarchy中会多出DontDestroyOnLoad,⽽你上⼀个场景中的没销毁的对象会会在这个⾥⾯:
就因为场景运⾏时多出了这个对象,所以你在下⼀个场景的start⽅法⾥能⽤
int param = GameObject.Find("GameData").GetComponent<GameData>().param;获取上⼀个场景中给GameData赋的值。
后续:
刚按照⽹上了解到的单例模式修改了⼀下GameData:
public class GameData : MonoBehaviour
{
public static GameData Instance { get; private set; }
public int param { get; set; } = 0;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
然后在SceneA上的:
GameObject.Find("GameData").GetComponent<GameData>().param = 12313213;
改成:
GameData.Instance.param = 12313213;
再把SceneB上的
int param = GameObject.Find("GameData").GetComponent<GameData>().param;
改成:
int param = GameData.Instance.param 这样感觉使⽤起来⽅便了很多。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论