1

我已经对此进行了一些研究,但似乎没有任何方法可以正常工作。希望有人可以阐明我做错了什么。

在我正在开发的这个 2D Unity 游戏中,我希望大炮跟随鼠标并围绕 z 轴旋转。当前代码正是这样做的,但我也想限制旋转。

Vector3 dir = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    Quaternion targetRotation = Quaternion.LookRotation(transform.position - dir.normalized, Vector3.forward);
    targetRotation.x = 0;
    targetRotation.y = 0;
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed * 10);

我尝试使用if-statements 来限制轮换:

if(eulerAngle > 65 && eulerAngle < 295) //pseudo code
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed * 10)

这有效,但将大炮的枪管锁定在 65 度或 295 度。我没有运气使用if语句来“解锁”枪管旋转。

我也尝试过使用四元数的类似语句:

float amountToRotate = Quaternion.Angle (transform.rotation, targetRotation);

我想,由于四元数的工作方式,即使远离目标,角度也会增加。类似于复平面上的数字?

mathf.clamp功能根本没有给我带来任何运气。

所有这些问题的解决方案可能都有一个简单的解决方案,但我似乎无法解决。

编辑:我更喜欢使用mathf.clamp这似乎是“最干净”的解决方案。

4

1 回答 1

1

问题似乎出在您的if状态逻辑中。

让我们把它分解成一些逻辑块:

  • 如果值大于 65 > 检查下一个块

如果不是这种情况,则意味着该值小于或等于 65 并且if不会运行。在下一个块中(如果值超过 65)

  • 如果值低于 295 > 执行 if 语句

如果不是这种情况,则意味着该值大于或等于 295。

首先,我建议将您的 if 语句转为包含等于

if(eulerAngle >= 65 && eulerAngle <= 295)

这使我们减少了一些需要考虑的检查。现在我们知道,如果您的大炮旋转冻结,那是因为角度低于 65(<65)或高于 295(>295)。

为了使 if 语句能够继续,您将希望该值再次位于值之间,因为您还向值添加了 = 检查。您现在可以将它们设置为 65 或 295,根据哪个超出范围。样品给你一个想法:

else if( eulerAngle < 65)
    eulerAngle = 65;
于 2015-01-16T16:21:13.727 回答