首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >夹紧旋转GameObject

夹紧旋转GameObject
EN

Stack Overflow用户
提问于 2021-10-25 23:55:28
回答 2查看 119关注 0票数 0

我已经尝试在我的一个游戏对象上夹紧一个旋转超过一个星期,仍然没有运气。到目前为止,这是我的代码,也是我尝试过的:

代码语言:javascript
复制
        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);
    }

然后我继续尝试这个:

代码语言:javascript
复制
    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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-26 06:12:00

已经提到了你的主要问题:

代码语言:javascript
复制
var x = Mathf.Clamp(0, -30, 30);

将始终返回0

一般来说,最好的方法是简单地存储局部的旋转,而不是通过eulerAngles (本地/全局并不重要)

,因为使用欧拉角来表示任何给定的旋转有不止一种方法,您返回的值可能与您指定的值有很大的不同。如果您试图逐步增加值以生成动画,这可能会造成混乱。

所以我宁愿用

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-26 00:05:40

您的第二个代码示例要简洁得多。唯一的问题是在最后一行:

代码语言:javascript
复制
transform.localEulerAngles = new Vector3( 0 , 0 , Mathf.Clamp(0, -30, 30) ); //this always returns [0,0,0]

我想你是说:

代码语言:javascript
复制
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的情况下写的,所以可能会有一些排版。而且,我已经有一段时间没用过联合了,我只是要离开记忆。

另外,我使用+=/-=更改了旋转,这样当您同时持有两个箭头时,它就不会旋转。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69715980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档