我已经对此进行了一些研究,但似乎没有任何方法可以正常运作。希望有人可以阐明我做错了什么。
在我正在研究的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
- 语句限制轮换:
if(eulerAngle > 65 && eulerAngle < 295) //pseudo code
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed * 10)
这可行,但将大炮的枪管锁定在65或295度。我没有运气使用if
语句来“解锁”枪管旋转。
我也尝试过使用Quaternions的类似声明:
float amountToRotate = Quaternion.Angle (transform.rotation, targetRotation);
我想,由于四元数的工作方式,即使远离目标,角度也会增加。类似于复平面上的数字?
mathf.clamp
函数根本没给我任何运气。
对于这个问题的解决方案可能很容易解决,但我似乎无法解决这个问题。
编辑:我更愿意使用mathf.clamp
,因为这似乎是“最干净”的解决方案。
答案 0 :(得分:1)
问题似乎出现在if
状态逻辑中。
让我们在一些逻辑块中分解它:
如果不是这种情况,则表示该值小于或等于65且if
不会运行。在下一个块中(如果值超过65)
如果不是这种情况,则表示该值大于或等于295。
首先,我建议将你的if语句改为包含等于
if(eulerAngle >= 65 && eulerAngle <= 295)
这给了我们一些不用考虑的检查。现在我们知道,如果你的大炮旋转冻结,那是因为角度低于65(<65)或高于295(> 295)。
要使if语句能够继续,您将希望值再次介于值之间,因为您还将= check添加到值中。您现在可以根据哪个超出范围将它们设置为65或295。样品给你一个想法:
else if( eulerAngle < 65)
eulerAngle = 65;