【问题标题】:How do I tell dominate x or y direction the best way possible?我如何以最好的方式告诉主宰 x 或 y 方向?
【发布时间】:2017-01-12 05:10:37
【问题描述】:

好的,我正在 Unity 中制作视频游戏,目前正在研究 2D 四向定向运动状态机。我的空闲动画不知道该怎么走。我已经浏览了这个代码 x 100,我几乎可以肯定那里有更好的方法......

X 和 Y 是浮点数,所以我需要将它们与 Epsilon 进行比较。我已经做了一个 switch 语句,现在这个 if 语句。最终的最终目标是一次计算的 switch 语句,因为我这里基本上是做 4 个 if 语句

private void SetCharacterDirection(float x, float y)
{
    if (Mathf.Abs(x) - Mathf.Abs(y) > Mathf.Epsilon)
    {
        _characterDirection = Mathf.Abs(x) > Mathf.Epsilon ? CharacterDirections.Right : CharacterDirections.Left;
    }
    else
    {
        _characterDirection = Mathf.Abs(y) > Mathf.Epsilon ? CharacterDirections.Up : CharacterDirections.Down;
    }
}

有一些使用绝对值、余弦、math.floor()、math.ceiling 甚至向量2 的魔法组合;但我一直在看这个很久,看不到它。请帮忙。

【问题讨论】:

  • 您实际上并不需要使用 epsilon 进行大于/小于比较 - 仅用于“相等”,并且 C# 对浮点比较比 C++ 更宽容。为什么要比较 X 和 Y?这些代表什么?
  • 它们代表方向。如果它们都不是 0,我需要最接近整数值(1x、1y、-1x 或 -1y)的整数
  • 例如:(0.4X, -0.5Y) == (0X, -1Y) 还有:(0.1X, -0.2Y) == (0X, -1Y)

标签: c# switch-statement unity5


【解决方案1】:

听起来你只是想要一个基于最大量级的输入组件的上、下、左或右。

试试这个(我还没有编译过)

private void SetCharacterDirection(float x, float y)
{
    var absX = Mathf.Abs(x);
    var absY = Mathf.Abs(y);

    if (absX > absY)
    {
      _characterDirection = Mathf.Sign(x) > 0 ? CharacterDirections.Right : CharacterDirections.Left;
    }
    else if (absX < absY)
    {
      _characterDirection = Mathf.Sign(y) > 0 ? CharacterDirections.Up : CharacterDirections.Down;
    }
    // implicitly ignore case where X == Y
}

【讨论】:

  • 你不能这样做 (x == 0.0f && y == 0.0f) 你需要 epsilon,文档here. 我遇到了这两种解决方案,可能已经到过厌倦了意识到没有神奇的功能可以在一个条件中找到它,因为您正在评估两个不同的点。 (因此是二维的)。虽然我必须问,为什么你先检查什么都不做?快速失败?
  • 第二种方法的key计算不正确,所以我去掉了。此外,它只是混淆事物,你会得到 if 以静默忽略 x ~= y 的条件。
  • 我绕着圈子走着有点着迷,但你对它的新眼睛让我回过神来。您的最新版本是一些干净的代码。马上,非常感谢。
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多