微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们可以在使用 Unity Event 主要问题为什么?

如何解决我们可以在使用 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;
        }
    }
}

然后我在 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 后退出,所以它只会被执行一次。但这似乎是故意的。


其实还有两点:

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

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。