执行一段代码后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)。点击播放,现在一次只能选择一个开关。
我是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)。点击播放,现在一次只能选择一个开关。