我已经尝试在我的一个游戏对象上夹紧一个旋转超过一个星期,仍然没有运气。到目前为止,这是我的代码,也是我尝试过的:
if ((transform.rotation.eulerAngles.z > 330 ) && (Input.GetKey(KeyCode.RightArrow)))
{
transform.Rotate(Vector3.forward * speed * Time.deltaTime * -1);
}
if ((transform.rotation.eulerAngles.z < 30) && (Input.GetKey(KeyCode.LeftArrow)))
{
transform.Rotate(Vector3.forward * speed * Time.deltaTime);
}然后我继续尝试这个:
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotate(Vector3.forward * speed * Time.deltaTime * -1);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Rotate(Vector3.forward * speed * Time.deltaTime);
}
transform.localEulerAngles = new Vector3( 0 , 0 , Mathf.Clamp(0, -30, 30) );但我还是没有运气。顺便说一下,我使用的是C#

这是它看起来的游戏类型,我也希望玩家在没有按下键的情况下旋转回0。
发布于 2021-10-26 06:12:00
已经提到了你的主要问题:
var x = Mathf.Clamp(0, -30, 30);将始终返回0。
一般来说,最好的方法是简单地存储局部的旋转,而不是通过eulerAngles (本地/全局并不重要)
,因为使用欧拉角来表示任何给定的旋转有不止一种方法,您返回的值可能与您指定的值有很大的不同。如果您试图逐步增加值以生成动画,这可能会造成混乱。
所以我宁愿用
private float zRotation;
private void Update ()
{
if (Input.GetKey(KeyCode.RightArrow))
{
zRotation -= speed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
zRotation += speed * Time.deltaTime;
}
zRotation = Mathf.Clamp(zRotation, -30, 30);
transform.localRotation = Quaternion.Euler(0, 0, zRotation);
}发布于 2021-10-26 00:05:40
您的第二个代码示例要简洁得多。唯一的问题是在最后一行:
transform.localEulerAngles = new Vector3( 0 , 0 , Mathf.Clamp(0, -30, 30) ); //this always returns [0,0,0]我想你是说:
float rotation = 0;
if (Input.GetKey(KeyCode.RightArrow))
{
rotation -= 1;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rotation += 1;
}
float newZAngle = transform.localEulerAngles.Z + (speed*Time.deltaTime*rotation);
transform.localEulerAngles = new Vector3( 0 , 0 , Mathf.Clamp(newZAngle, -30, 30) );我是在没有IDE的情况下写的,所以可能会有一些排版。而且,我已经有一段时间没用过联合了,我只是要离开记忆。
另外,我使用+=/-=更改了旋转,这样当您同时持有两个箭头时,它就不会旋转。
https://stackoverflow.com/questions/69715980
复制相似问题