Unity中如何从另一个场景的脚本获取数值
解决Unity跨场景调用DontDestroyOnLoad变量的问题
方法一:通过FindObjectOfType获取脚本实例
首先确保第一个场景的脚本所在GameObject已设置DontDestroyOnLoad,示例脚本:
// 第一个场景的脚本,比如命名为NumberRangeSetup.cs using UnityEngine; using UnityEngine.UI; public class NumberRangeSetup : MonoBehaviour { public InputField minInput; public InputField maxInput; public int inputmin; public int inputmax; void Awake() { // 标记该对象不随场景销毁 DontDestroyOnLoad(gameObject); } // 点击确认按钮时保存输入值并切换场景的方法 public void SaveRangeAndSwitch() { int.TryParse(minInput.text, out inputmin); int.TryParse(maxInput.text, out inputmax); UnityEngine.SceneManagement.SceneManager.LoadScene("第二个场景名称"); } }
在第二个场景的脚本中,通过FindObjectOfType找到该脚本实例,直接访问变量:
// 第二个场景的脚本,比如命名为GuessGame.cs using UnityEngine; public class GuessGame : MonoBehaviour { void Start() { // 查找第一个场景中保留的脚本实例 NumberRangeSetup rangeSetup = FindObjectOfType<NumberRangeSetup>(); if (rangeSetup != null) { int min = rangeSetup.inputmin; int max = rangeSetup.inputmax; Debug.Log($"当前猜数字范围:{min} - {max}"); // 这里编写你的猜数字逻辑 } } }
方法二:使用单例模式(更可靠)
单例模式可以避免FindObjectOfType的性能问题,且变量访问更直接。修改第一个场景的脚本为单例:
// 第一个场景的单例脚本,命名为NumberRangeManager.cs using UnityEngine; using UnityEngine.UI; public class NumberRangeManager : MonoBehaviour { // 静态实例,全局可直接访问 public static NumberRangeManager Instance; public int inputmin; public int inputmax; public InputField minInput; public InputField maxInput; void Awake() { // 确保全局只有一个实例 if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { // 销毁重复创建的对象 Destroy(gameObject); } } public void SaveAndSwitchScene() { int.TryParse(minInput.text, out inputmin); int.TryParse(maxInput.text, out inputmax); UnityEngine.SceneManagement.SceneManager.LoadScene("第二个场景名称"); } }
在第二个场景的脚本中,直接通过单例访问变量:
// 第二个场景的脚本 using UnityEngine; public class GuessGame : MonoBehaviour { void Start() { // 直接通过单例获取变量 int min = NumberRangeManager.Instance.inputmin; int max = NumberRangeManager.Instance.inputmax; Debug.Log($"猜数字范围:{min} 到 {max}"); // 执行你的游戏逻辑 } }
注意事项
- 确保脚本中的
inputmin和inputmax是public修饰的;如果用private,需添加[SerializeField]并提供public属性(比如public int InputMin => inputmin;) - 使用单例时,Awake中的判断逻辑会自动处理场景切换时的重复实例问题
- 切换场景前,务必先调用保存输入值的方法,确保变量已正确赋值
内容的提问来源于stack exchange,提问作者tunahanarik
相关产品推荐
相关产品推荐

