Unity UI:如何在其面板停用然后重新激活后重新启用下拉列表?

时间:2017-12-09 01:22:17

标签: unity3d drop-down-menu

我是Unity的新手,所以这可能是一个愚蠢的问题但是这里有: 我有一个Unity应用程序;它有几个场景。其中一个场景有一个Canvas,其上有几个重叠的面板。在其中一个小组(PanelA)上,有一个下拉列表。当应用程序第一次运行时,PanelA处于活动状态并默认位于顶部,并且下拉列表工作正常。但在我通过C#调用

停用PanelA之后
panelA.SetActive(false);// hides the panel

然后再重新激活它:

panelA.SetActive(true); // redisplays the panel

点击时,下拉列表不再显示其选项列表。下拉列表仍然存在,仍显示其第一个选项"无"当点击下拉列表更改颜色以指示它被触摸时,但下拉列表不会下拉其选项列表。 我错过了什么?为什么下拉菜单没有显示选项列表? 感谢

Windows 10 Pro v1709,统一2017.1.1f1个人

我的层次结构是这样的,PanelB是在PanelA取消激活后设置为活动的面板: enter image description here

选择下拉选项时调用的脚本在Start()中调用:

PickDropDown.onValueChanged.AddListener(delegate {
            myDropdownValueChangedHandler(PickDropDown);
        });

并且被调用的函数是:

    private void myDropdownValueChangedHandler(Dropdown target) {
        Debug.Log("selected: "+target.value);
        stage = 0;

        currentval = PickDropDown.options [PickDropDown.value].text;
        advice.text = "";
        title.text = currentval;
        if (currentval != NONE) {
            advice.text = "You chose to do  "+currentval;
            nextVal();
        }
    }

    void newVal(){
        Debug.Log("newVal  " );

        PanelA.SetActive (true);
        PanelB.SetActive (false);
        Debug.Log("options  count="+ PickDropDown.options.Count );
    }

    void nextVal(){
        Debug.Log("nextSet  " );
        PanelB.SetActive (true);
        /*** next line shows the answer to my problem - from killer_mech **/   
        Destroy(PickDropDown.transform.Find("Dropdown List").gameObject);
        /***************************************************************/
        PanelA.SetActive (false);
    }

1 个答案:

答案 0 :(得分:3)

是的,这是一个团结的错误。我现在可以重现这个。发生这种情况是因为Unity正在创建一个名为" 下拉列表的游戏对象"内部下拉,在结束后应该被摧毁。但是我注意到在破坏时发生了轻微的延迟(我使用了编辑器调试模式)。当您将游戏对象活动标志设置为false时,它会以某种方式停止销毁对象,并导致对象下拉列表停留在那里,以便下次当您尝试与其进行交互时,该对象仍将存在。在此之后,您还会注意到下拉列表下方的白色框,表示下拉列表仍然存在。

对于解决方案,我所做的就是在我准备关闭我的游戏对象之前,我使用了

<强> Destroy(PickDropDown.transform.Find("Dropdown List").gameObject);

销毁此对象可以解决问题。我知道这不是一个很好的方法,但我检查是否有任何对选项的引用在销毁时被销毁,这导致我没有错误。 Dropdown会创建新的&#34; 下拉列表&#34;游戏对象。因此可以安全地假设破坏是可以的。不知道是否有任何其他好的解决方案,但现在你可以使用它。

注意:我已经使用Panel,Empty Gameobject作为父级进行了测试,最后使用Dropdown

进行了测试

enter image description here enter image description here

enter image description here

这显示了下拉列表中发生的情况。 1)在没有弹出的情况下2)在打开期间3)在孩子被摧毁之前关闭setactive后。