C# 我们可以在使用Unity事件调用的函数中添加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

我在方法调用displayCubeInoder()中实现了一个简单的for循环(如下所示)

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);