【问题标题】:Can we add for loop inside a function that is called with an Unity Event [closed]我们可以在使用 Unity 事件调用的函数中添加 for 循环吗?
【发布时间】:2021-02-11 00:43:44
【问题描述】:

我在方法调用 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 循环似乎只执行了一次。感谢您对这里出了什么问题的任何建议。

更新: 好吧,我设法解决了这个问题。我的代码 sn-p 中有一个巨大的错误。我的条件从未得到满足。滑块值是浮点数,因此在我的情况下,我将浮点数与整数进行比较。我认为 C# 中的 (/) 除法返回一个整数。当我将 (i-1)/10 和 i/10 转换为 (float)(i-1)/10 和 (float)(i/10) 时,它起作用了。同样,我认为以这种方式比较两个浮点数并不是一个好习惯。 derHugo 给出了很好的回答。

【问题讨论】:

  • 你的意思是第一次更新滑块上的值就可以了,但是后续更新不调用displayCubeInOrder?

标签: c# for-loop unity3d events slider


【解决方案1】:

首先当然可以! ;)

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 后退出,所以无论如何它只会执行一次。但这似乎是故意的。


其实还有两点:

  1. 您可以给您的方法一个float 参数,然后您不必获取Slider.Value 但已经直接从滑块中获取它(您必须将其引用为动态onValueChanged 中回调)。

    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
    ...

【讨论】:

    【解决方案2】:

    正如@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
    

    条件满足,如果块被执行并中断循环。

    【讨论】:

    • 第二部分你的解释有误:0 &lt; 0false
    • 不,循环以 i/10 为 1/10 开始,小于 0。
    • 1/10 不小于 0 ... 1/10 正好是 0 ..
    • 是的,很抱歉。我会编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2021-06-04
    • 2017-12-31
    • 2021-11-08
    相关资源
    最近更新 更多