执行一段代码后Unity 5无响应

Unity 5 unresponsive after a piece of code is executed

我是unity的绝对初学者。我一直在研究 UI 这是一个简单的登录表单。其中我有两个 Toggle 用于选择性别,即男性或女性。我一直在做的是调用一个方法来检查是否已经选择了男性,当按下另一个切换按钮时,它将从男性中删除检查。

当我点击女性 Toogle 时,我的 Unity 冻结了。这是我的代码。

Toggle female;
Toggle male;
void Start(){
    female = GameObject.Find ("toggle_female").GetComponent<Toggle> ();
     male = GameObject.Find ("toggle_male").GetComponent<Toggle> ();
}

 public void isMale(){
    if (female.isOn)
        female.isOn = false;

    male.isOn = true;

}

public void isFemale(){
    if (male.isOn)
        male.isOn = false;

    female.isOn = true;
}

我猜 isMale 和 isFemale 这两个函数是 Toggles 的事件处理程序。根据 Unity 文档:

The Toggle has a single event called On Value Changed that responds when the user changes the current value

所以问题是这些事件处理程序响应值更改而不是切换被检查,因此您的代码导致无限循环。它应该首先阅读它们以确保它是一个检查而不是取消检查:

 public void isMale(){
    if (!male.isOn) return;

    if (female.isOn)
        female.isOn = false;

    male.isOn = true;

}

public void isFemale(){
    if (!female.isOn) return;

    if (male.isOn)
        male.isOn = false;

    female.isOn = true;
}

您运行与您的 Toggle 陷入无限循环。

当女性切换时,onValueChanged event is triggered. I assume that your isFemale() function is linked with the Toggle onValueChanged事件,所以isFemale()将被调用。

当调用 isFemale() 时,它会执行 male.isOn = false; 导致 isMale() 函数被调用,然后 运行 female.isOn = false; 导致 isFemale() 被再次调用。这是永恒的。

当从脚本设置 isOn 时,不应触发 onValueChanged 事件。就是这个问题。

解决方案:

您正在寻找 ToggleGroup

1.Create male toggle GameObject -> UI -> Toggle然后命名为Male toggle.

2.Create female toggle GameObject -> UI -> Toggle 然后命名为Female toggle。您可以稍后更改标签文本。

3.创建一个空的游戏对象。 GameObject -> Create Empty。 将其重命名为 ToggleGroup.

Select新建的GameObject,进入Component -> ToggleGroup.现在,您有一个名为 ToggleGroup 的游戏对象,并附加了 ToggleGroup 组件。

4.Select 你的 Male toggle,然后拖动 ToggleGroup GameObject 进入 Male toggle 的 Group 插槽。 Select 你的 Female toggle,然后将 ToggleGroup GameObject 拖入 Female toggle Group插槽

Select 你的 Female toggle,然后 unckeck Is On 复选框确保默认情况下只选择一个(Male toggle)。点击播放,现在一次只能选择一个开关。