C# 我们可以在使用Unity事件调用的函数中添加for循环吗
我在方法调用displayCubeInoder()中实现了一个简单的for循环(如下所示)C# 我们可以在使用Unity事件调用的函数中添加for循环吗,c#,for-loop,unity3d,events,slider,C#,For Loop,Unity3d,Events,Slider,我在方法调用displayCubeInoder()中实现了一个简单的for循环(如下所示) public void displayCubeInoder(滑块) { 对于(int i=1;i=(i-1)/10&&slider.Value=(i-1)/10&&slider.Value=(1-1)/10//第一部分为真 //0看这个答案的底部 主要问题 您的条件为“从不”真,因为您使用的是“整数除法” 当然,这取决于滑块可能具有的值,但从使用情况来看,我假设它类似于[0f;1f] 然后是第一部分 s
public void displayCubeInoder(滑块)
{
对于(int i=1;i<10;i++)
{
如果(slider.Value>=(i-1)/10&&slider.Value
然后我在事件下调用这个方法,在值更新时(SliderEventData)
然而,for循环似乎只执行一次。如果您对这里的问题有任何建议,我将不胜感激
更新:
嗯,我设法解决了这个问题。我的代码片段中有一个巨大的错误。我的条件从未得到满足。滑块值是一个浮点值,因此在我的条件下,我将浮点值与整数进行比较。我认为C#中的(/)除法返回一个整数。当我将(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=(1-1)/10//第一部分为真
//0<1/10//第二部分为假
如果执行块并中断循环,则满足条件。首先当然可以!;) tl;但是你不必非得在你的情况下->看这个答案的底部
主要问题 您的条件为“从不”真,因为您使用的是“整数除法” 当然,这取决于滑块可能具有的值,但从使用情况来看,我假设它类似于
[0f;1f]
然后是第一部分
slider.Value >= (i-1)/10
可能会一直都正确!!另一方面
slider.Value < i/10
及
将始终为0
假设您的滑块具有值[0;x]
(因此至少始终为正值),则条件
x >= 0
当
x < 0
f
产生了巨大的差异,因为它将10
转换为float
值,因此/
操作符现在将这两个值视为float
并返回float
值
即使现在,你仍然有一个中断
,因此循环在第一次条件为true
后退出,因此它无论如何只执行一次。但这似乎是故意的
实际上还有两点:
您可以为您的方法提供一个float
参数,这样您就不必获取滑块.Value
,而是直接从滑块获取它(您必须在onValueChanged
中将其引用为动态回调)
无论哪种方式,您甚至根本不需要该循环(假设中断是有意的)!而是使用例如
[0;0.05)
→ 0
[0.05;0.15)
→ 1
[0.15;0.25)
→ 2
[0.25;0.35)
→ 3
[0.35;0.45)
→ 4
或者根据您的需要转到下一个较低的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
您的意思是,第一次更新滑块上的值时,它会工作,但后续更新不会调用DisplayCubeInoder?第二部分在您的解释中是错误的:0
是false
!不,循环以1/10开始,因此i/10是小于0的1/10。1/10不小于0
…1/10正好是0
是的,很抱歉。我会编辑答案的。
(i - 1) / 10
x >= 0
x < 0
if(slider.Value >= (i-1) / 10f && slider.Value < i / 10f)
public void OnSliderValueChanged(float sliderValue)
{
...
}
var index = Mathf.RoundToInt(sliderValue * 10);
displayCube(index);
var index = Mathf.FloorToInt(sliderValue * 10);
displayCube(index);