【问题标题】:Float Values Either Defaulting To 1 or 0浮点值默认为 1 或 0
【发布时间】:2017-01-23 22:05:14
【问题描述】:

我正在尝试为 Unity 中的 CellSize 解决一些问题。 这是针对 GridLayoutGroup 组件的。我发现使用计算器完成后效果非常好:Screen.Width/1280、Screen.Height/720。 因为我使用 720p 作为基本分辨率,并且在那里一切看起来都很好,所以我使用它作为基本分辨率。 100x100 看起来非常适合 720p 上的单元格大小。

例如它们的分辨率是 1280:1024 它应该出来 (100, 142) 但是它总是出来 (1.0, 1.0)。 如果分辨率很小……比如 320x200,它会出现 (0.0, 0.0)。

这是我的代码:

SlotPanel.GetComponent<GridLayoutGroup>().cellSize = new Vector2((Cam.pixelWidth / 1280) * 100, (Cam.pixelHeight / 720) * 100);

Cam 是玩家使用的相机。 我尝试的另一个代码是:

SlotPanel.GetComponenet<GridLayoutGroup>().cellSize = new Vector2((Screen.Width / 1280) * 100, (Screen.Height / 720) * 100);

两者都会导致相同的问题。在这一点上,我对自己的愤怒感到无语。我不明白为什么数学是正确的,但它不正确。

【问题讨论】:

  • 尝试 1280.0, 100.0 代替
  • @doctorlove 实际上1280f(或1280.0f)和720f720.0f)在这种情况下,因为您需要Vector2 的单精度(请参阅下面的第一条评论回答) .

标签: c# unity3d unity5


【解决方案1】:

Cam.pixelWidth / 1280 &c。在整数算术中计算;任何剩余的都将被丢弃。

重写为100.0 * Cam.pixelWidth / 1280 以确保评估以浮点进行(由于两个整数参数的提升)。还有其他方法,但我发现这个方法最清楚,因为更改第一个系数从一开始就告诉读者你的代码你想做什么。

(如果您要求表达式的类型是单精度浮点类型,则使用100f 代替100.0)。

这是使用多余括号实际上有害的情况之一。

【讨论】:

  • 不要忘记 100.0f 后面的 f,因为 unity 使用浮点数而不是双精度数
  • 我不同意多余的括号在这里有害。它们与问题无关。但是@xyLe_ 是对的,你不应该使用100.0,它是double,因为你必须先转换为float(也称为System.Single),然后才能调用Vector2 构造函数。因此,在这种情况下,您应该使用 100.0f 或仅使用 100f。如果要保持操作顺序,请改用1280f。我认为先除然后再乘以一百没有问题。
  • @JeppeStigNielsen:我添加了100f 案例。我在凌晨 3 点的调试会议上留下了伤痕,其中一些华而不实的 quant 将一些括号引入了对整数类型进行分组的表达式中。可悲的是,它是在“测量变化”术语中,因此为零的影响不会立即引起注意。 学习您的运算符优先级表是无可替代的。
  • 原始问题的表达式为(Cam.pixelWidth / 1280) * 100。然后划分是“第一”。您正确地解释了这是一个整数除法,即转到 C# 预定义重载 int static operator /(int, int),它返回 int,正如您所说,余数被丢弃。如果提问者去掉括号,他会得到Cam.pixelWidth / 1280 * 100。对于人类数学家来说,这有点难以阅读。但是,我们都同意 C# 中的含义完全相同。再次除法/“首先出现”(因为这次是左关联性)。
  • ... 因此,我倾向于得出结论,多余的括号是无害的。问题与括号无关。多余的括号对我来说似乎是无辜的;它可以帮助可能想要确定订单实际上是故意的人类读者。我并不是说我推荐多余的括号,我只是建议它们是无害的。
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2015-12-05
  • 2022-12-10
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多