Unity 如何在Dropdown中选中一个值后获得该值并传给其他脚本。

问题遇到的现象和发生背景

img

如图,比如我选中了Sword这个选项,我怎么在点击button之后将Sword这个名字传给另一个场景,使那个场景的一个Text变为Sword?确切的说,我该怎么得到当前下拉框中的值。

问题相关代码,请勿粘贴截图
    public TMP_Dropdown NamesDropDown;
    public TMP_Text Text;
    IEnumerator GetData()
    {
         //从API上获得武器列表数据
        string url = "https://example";
        using(var request = UnityWebRequest.Get(url))
        {
            yield return request.SendWebRequest();
            if (request.isHttpError || request.isNetworkError)
                Debug.LogError(request.error);
            else
            {
                string json = request.downloadHandler.text;
                weaponsData = JsonUtility.FromJson<WeaponsData>(json);
            }
        }
        //将武器数据的名字放入下拉菜单
        if(weaponsData != null && weaponsData.Weapons.Count>0)
        {
            NamesDropDown.options.Clear();
            foreach (var weapon in weaponsData.Weapons)
            {
                NamesDropDown.options.Add(new TMP_Dropdown.OptionData(weapon.Name));
            }
            NamesDropDown.value = 0;

            //在下拉框下面的文本中显示下拉框中的值
            DropdownSelected(NamesDropDown);
            NamesDropDown.onValueChanged.AddListener(delegate{DropdownSelected(NamesDropDown);});
        }
        void DropdownSelected(TMP_Dropdown dropdown)
        {
            int index = dropdown.value;
            Text.text = dropdown.options[index].text;
        }
    }
运行结果及报错内容

上面代码中, DropdownSelected方法确实能将定义的文本(Text)变为下拉框中的值

Text.text = dropdown.options[index].text;

但我不知道该怎么将这段代码得到的值作为参数传递出去。
所以我想问问有没有一个什么方法能直接获取到下拉框的值。

解决方法一:
最简单的方法可以使用Unity带的玩家偏好进行处理。

实现方法:在第35行后添加:PlayerPrefs.SetString("dropdowntext", dropdown.options[index].text);,在切换场景后使用的地方就可以这样获取:string str = PlayerPrefs.GetSgtring("dropdowntext");


解决方法2:
使用不销毁的物体身上的脚本进行存储,如:你上面这个脚本在其Start方法中添加DontDestroyOnLoad(this.gameObject);,这样即使你切换场景,这个脚本所挂载的物体也不会被销毁,你也就可以通过查找物体获取组件的方式来取得其中保存的值了。


解决方法3:

定义一个数据类,专门用来保存这个数值,为了方便可以直接定义为静态属性这样在其他类中也可以直接读取该属性,实现代码大致如下:

class GameData{
  public static string DropdownText{get;set;}
}

在原文第35行后添加GameData.DropdownText = drpdown.options[index].text,然后在切换场景后也直接读取此属性即可string str = GameData.DropdownText


第一种方法之所以称之为最简单的是因为它不用去理解什么逻辑,你只需知道它是用怎么使用的就行了。(不过项目中通常使用这个方式进行本地数据存储,不会用它来保存跳转场景的数据保存)
第二,三种,是在跳转场景时用来保存数据的常用方式,建议尝试理解实现一下,为以后得使用做好基础。

你可以定义一个全局变量string str获取下拉框的值str= dropdown.options[index].text;,然后点击按钮时将str传递出去就行了。