You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:05:32