我们可以在使用 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 后退出所以它只会执行一次。不过这个好像是故意的


其实还有两点:

  1. 你可以给你的方法一个 float 参数,然后你不必获取 Slider.Value 但已经直接从滑块获取它(你必须在 onValueChanged).

    中将其引用为 dynamic 回调
    public void OnSliderValueChanged(float sliderValue)
    { 
        ... 
    }
    
  2. 无论哪种方式,您甚至根本不需要该循环(假设 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
    ...