我们可以在使用 Unity 事件调用的函数中添加 for 循环吗
Can we add for loop inside a function that is called with an Unity Event
我在方法调用 displayCubeInOrder() 中实现了一个简单的 for 循环(如下所示);
public void displayCubeInOrder(Slider slider)
{
for (int i = 1; i < 10; i++)
{
if(slider.Value >= (i-1)/10 && slider.Value < i/10)
{
displayCube(i - 1);
break;
}
}
}
然后我在事件下调用这个方法,On Value Updated (SliderEventData)。
不过,for循环好像只执行了一次。感谢任何关于这里出了什么问题的建议。
更新:
好吧,我设法解决了这个问题。我的代码片段中存在一个巨大的错误。我的条件从未得到满足。滑块值是一个浮点数,所以在我的情况下,我将浮点数与整数进行比较。我认为 C# returns 中的 (/) 除法是一个整数。当我将 (i-1)/10 和 i/10 转换为 (float)(i-1)/10 和 (float)(i/10) 时它起作用了。同样,我认为以这种方式比较两个浮点数不是一个好习惯。来自 derHugo 的精彩回答。
因为@derHugo 给出了一个很好的解释,它甚至没有被执行一次。
解释:(假设slider.value = 0)
if(slider.Value >= (i-1)/10 && slider.Value < i/10)
// for i==1 ,
// 0 >= (1-1)/10 //first part is true
// 0 < 1/10 //second part is false
满足条件,如果块被执行并中断循环。
首先你当然可以! ;)
tl;dr:但你不必在你的情况下 -> 请参阅此答案的底部。
主要问题
你的条件 NEVER 为真,因为你正在使用 整数除法!
这当然取决于您的滑块可能具有的值,但从使用情况来看,我认为它类似于 [0f; 1f]
。
然后是第一部分
slider.Value >= (i-1)/10
可能 一直 是 true
!!另一方面
slider.Value < i/10
很可能永远不会成为true
!
为什么?
好吧,您使用的是 整数除法 并且 i
永远不会比 10
大,但具有值 [1; 9]
所以两者
i / 10
和
(i - 1) / 10
永远是 0
!
并假设您的滑块具有值 [0; x]
(因此至少始终为正值)条件
x >= 0
总是 true
而
x < 0
永远不会 true
.
=> 我很确定你的方法根本没有被循环调用过一次。
您应该确保使用 浮点除法
if(slider.Value >= (i-1) / 10f && slider.Value < i / 10f)
f
产生了巨大的差异,因为它将 10
变成了 float
值,因此 /
运算符现在将这两个值都视为 float
还有 return 一个 float
值!
即使现在你仍然有一个 break
所以循环在第一次条件为 true
后退出所以它只会执行一次。不过这个好像是故意的
其实还有两点:
你可以给你的方法一个 float
参数,然后你不必获取 Slider.Value
但已经直接从滑块获取它(你必须在 onValueChanged
).
中将其引用为 dynamic 回调
public void OnSliderValueChanged(float sliderValue)
{
...
}
无论哪种方式,您甚至根本不需要该循环(假设 break
是故意的)!而是使用例如计算您想要的单个索引RoundToInt
var index = Mathf.RoundToInt(sliderValue * 10);
displayCube(index);
[0; 0.05)
→ 0
[0.05; 0.15)
→ 1
[0.15; 0.25)
→ 2
[0.25; 0.35)
→ 3
[0.35; 0.45)
→ 4
...
或根据您的需要 FloorToInt
轮到下一个较低的 int
var index = Mathf.FloorToInt(sliderValue * 10);
displayCube(index);
[0; 0.1)
→ 0
[0.1; 0.2)
→ 1
[0.2; 0.3)
→ 2
[0.3; 0.4)
→ 3
[0.4; 0.5)
→ 4
...
我在方法调用 displayCubeInOrder() 中实现了一个简单的 for 循环(如下所示);
public void displayCubeInOrder(Slider slider)
{
for (int i = 1; i < 10; i++)
{
if(slider.Value >= (i-1)/10 && slider.Value < i/10)
{
displayCube(i - 1);
break;
}
}
}
然后我在事件下调用这个方法,On Value Updated (SliderEventData)。
不过,for循环好像只执行了一次。感谢任何关于这里出了什么问题的建议。
更新: 好吧,我设法解决了这个问题。我的代码片段中存在一个巨大的错误。我的条件从未得到满足。滑块值是一个浮点数,所以在我的情况下,我将浮点数与整数进行比较。我认为 C# returns 中的 (/) 除法是一个整数。当我将 (i-1)/10 和 i/10 转换为 (float)(i-1)/10 和 (float)(i/10) 时它起作用了。同样,我认为以这种方式比较两个浮点数不是一个好习惯。来自 derHugo 的精彩回答。
因为@derHugo 给出了一个很好的解释,它甚至没有被执行一次。
解释:(假设slider.value = 0)
if(slider.Value >= (i-1)/10 && slider.Value < i/10)
// for i==1 ,
// 0 >= (1-1)/10 //first part is true
// 0 < 1/10 //second part is false
满足条件,如果块被执行并中断循环。
首先你当然可以! ;)
tl;dr:但你不必在你的情况下 -> 请参阅此答案的底部。
主要问题
你的条件 NEVER 为真,因为你正在使用 整数除法!
这当然取决于您的滑块可能具有的值,但从使用情况来看,我认为它类似于 [0f; 1f]
。
然后是第一部分
slider.Value >= (i-1)/10
可能 一直 是 true
!!另一方面
slider.Value < i/10
很可能永远不会成为true
!
为什么?
好吧,您使用的是 整数除法 并且 i
永远不会比 10
大,但具有值 [1; 9]
所以两者
i / 10
和
(i - 1) / 10
永远是 0
!
并假设您的滑块具有值 [0; x]
(因此至少始终为正值)条件
x >= 0
总是 true
而
x < 0
永远不会 true
.
=> 我很确定你的方法根本没有被循环调用过一次。
您应该确保使用 浮点除法
if(slider.Value >= (i-1) / 10f && slider.Value < i / 10f)
f
产生了巨大的差异,因为它将 10
变成了 float
值,因此 /
运算符现在将这两个值都视为 float
还有 return 一个 float
值!
即使现在你仍然有一个 break
所以循环在第一次条件为 true
后退出所以它只会执行一次。不过这个好像是故意的
其实还有两点:
你可以给你的方法一个
中将其引用为 dynamic 回调float
参数,然后你不必获取Slider.Value
但已经直接从滑块获取它(你必须在onValueChanged
).public void OnSliderValueChanged(float sliderValue) { ... }
无论哪种方式,您甚至根本不需要该循环(假设
break
是故意的)!而是使用例如计算您想要的单个索引RoundToInt
var index = Mathf.RoundToInt(sliderValue * 10); displayCube(index);
[0; 0.05)
→ 0
[0.05; 0.15)
→ 1
[0.15; 0.25)
→ 2
[0.25; 0.35)
→ 3
[0.35; 0.45)
→ 4
...或根据您的需要
FloorToInt
轮到下一个较低的int
var index = Mathf.FloorToInt(sliderValue * 10); displayCube(index);
[0; 0.1)
→ 0
[0.1; 0.2)
→ 1
[0.2; 0.3)
→ 2
[0.3; 0.4)
→ 3
[0.4; 0.5)
→ 4
...