weixin_44157032 2022-09-03 18:28 采纳率: 68.8%
浏览 706
已结题

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;

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

  • 写回答

2条回答 默认 最新

  • 陈言必行 Unity领域优质创作者 2022-09-04 08:42
    关注

    解决方法一:
    最简单的方法可以使用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


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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月6日
  • 已采纳回答 9月4日
  • 修改了问题 9月3日
  • 创建了问题 9月3日

悬赏问题

  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡