unity3d - 钳位旋转值
Posted
技术标签:
【中文标题】unity3d - 钳位旋转值【英文标题】:unity3d - Clamp rotation value 【发布时间】:2015-07-20 10:03:34 【问题描述】:我有一个根据鼠标位置旋转的对象,但我想夹住它,使其不会进一步或低于某个值。这是我的代码:
void LookAt ()
float distance = transform.position.z - Camera.main.transform.position.z;
Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);
position = Camera.main.ScreenToWorldPoint(position);
position.x = Mathf.Clamp(position.x, -70, 70);
position.z = Mathf.Clamp(position.z, -70, 70);
Vector3 target = new Vector3 (position.x, transform.position.y, position.z); // Use current object positin.y
transform.LookAt(target);
但不幸的是它不起作用,它一直在旋转 360。
编辑: 这是一个 3D 自上而下的游戏,我有一个坦克,我想旋转它的上半部分。我上面写的代码非常适合这项工作,但现在我不知道如何限制它,所以枪管(我正在旋转的部分)总是朝上,敌人将从那里来。 70 或其他我正在测试的随机值,首先我想弄清楚正确的代码到底是什么,然后确定值是容易的部分。
【问题讨论】:
你能提供更多的上下文吗?使用场景的屏幕截图详细说明您想要做什么,并提供调用void LookAt()
的代码摘录。
LookAt() 在 Update() 中被调用,并且已经声明我不需要我的对象旋转 360,我想锁定它的值。除此之外,我看不出截图会有什么帮助?!
没有最少的上下文,很难为您提供正确的答案。您很少在不了解场景的情况下调试 Unity 脚本。我们不知道脚本在哪个对象上,对象和摄像机在场景中的位置,摄像机显示什么以及您想要的确切结果是什么。如果截图可以提供这些信息的数量,您可以根据需要书面描述。
为什么要计算屏幕空间中物体z坐标的距离,而不是使用相机的nearClipPlane?
另外,您不应该使用相同的变量来表示屏幕空间和世界空间位置。它使您的代码更难阅读和调试。
【参考方案1】:
实际上,问题在于您要锁定位置,而不是旋转。你让它看着某个点,但限制那个点而不是它需要旋转以满足它的角度。您必须使用三角函数来计算它想要指向的角度(更具体地说,是 atan2 函数),将 that 值钳制为 (-70, 70),然后应用 that 旋转到对象(使用欧拉角)。您需要对这些步骤中的任何一个进行进一步说明吗?
干杯。
附:请注意,atan2 返回一个以弧度为单位的值,但您的范围和欧拉角使用度数。
【讨论】:
【参考方案2】:您在世界空间中将目标位置限制为 70 个单位,这通常很多,但取决于您的游戏规模。我认为您想要做的是将鼠标位置限制在屏幕中心周围 70 像素。 (请在问题本身中提供此评论,这样我们就不必猜测了)。但是,由于您对目标的屏幕空间和世界空间位置使用了相同的变量,因此在将其转换为世界空间后,您可能会混淆并限制位置。
另外,您使目标的 y 坐标与对象相同。但这意味着每次目标经过时对象必须旋转 360 度。我假设您想要做的是假设目标位置位于相机位置。
void LookAt ()
var cursorPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, camera.main.nearClipPlane);
cursorPosition.x = Mathf.Clamp(position.x, -70, 70);
cursorPosition.z = Mathf.Clamp(position.z, -70, 70);
var targetPosition = Camera.main.ScreenToWorldPoint(cursorPosition);
transform.LookAt(targetPosition);
当您要求查找代码中的错误时,请提供有关您的推理和期望行为的详细信息。
【讨论】:
这是一个 3D 自上而下的游戏,我有一辆坦克,我想旋转它的上半部分。我上面写的代码非常适合这项工作,但现在我不知道如何限制它,所以枪管(我正在旋转的部分)总是朝上,敌人将从那里来。 70 或任何我正在测试的随机值,首先我想弄清楚正确的代码到底是什么,然后确定值是容易的部分。 那么,我对您的预期行为的假设是否正确?您仍然需要更详细地描述游戏世界的设置。以上是关于unity3d - 钳位旋转值的主要内容,如果未能解决你的问题,请参考以下文章