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

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 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行