问题描述
我在一个方法调用 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;
}
}
}
然后我在 Events,On Value Updated (SliderEventData) 下调用这个方法。
然而,for 循环似乎只执行一次。感谢您对这里出了什么问题的任何建议。
更新: 好吧,我设法解决了这个问题。我的代码片段中有一个巨大的错误。我的条件从未得到满足。滑块值是一个浮点数,所以在我的情况下,我将浮点数与整数进行比较。我认为 C# 中的 (/) 除法返回一个整数。当我将 (i-1)/10 和 i/10 转换为 (float)(i-1)/10 和 (float)(i/10) 时,它起作用了。同样,我认为以这种方式比较两个浮点数不是一个好习惯。来自 derHugo 的精彩回答。
解决方法
首先当然可以! ;)
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
并返回一个 float
值!
即使现在你仍然有一个 break
,所以循环在第一次条件为 true
后退出,所以它只会被执行一次。但这似乎是故意的。
其实还有两点:
-
你可以给你的方法一个
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
...
正如@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
条件满足,如果块被执行并中断循环。