如何设置对象旋转的2个限制?

时间:2019-06-15 03:23:23

标签: c# unity3d rotation limit

当按住D向上和W向下但要限制两个方向的旋转时,我需要使对象在z轴上旋转,使用下面提供的代码,我设法使对象在按下时旋转,但是达到我的变量设置的2个限制中的任何一个时,都不要停止旋转。

我是编码领域的新手,希望您能帮助我解决和理解我的问题。谢谢您的宝贵时间。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GyroDiscControls : MonoBehaviour{

public GameObject AltNeedleBright;
public float MaxAltNeedleRotation = -65f;
public float MinAltNeedleRotation = 135f ;
public void update (){

if (Input.GetAxisRaw("Vertical") > 0 & 
AltNeedleBright.transform.rotation.z > MaxAltNeedleRotation)
    {
        AltNeedleBright.transform.Rotate(0f, 0f, +15f * Time.deltaTime);
    }
if (Input.GetAxisRaw("Vertical") < 0 & 
AltNeedleBright.transform.rotation.z < MinAltNeedleRotation)
    {
        AltNeedleBright.transform.Rotate(0f, 0f, -15f * Time.deltaTime);
    }

}

2 个答案:

答案 0 :(得分:2)

首先,您要处理QuaternionQuaternion具有 4 个组成部分xyzw,在这里的行为并不像您期望的那样-永不改变或直接检查rotation.z的值。

第二个错误:默认情况下,transform.Rotate会在本地空间中进行旋转。因此,无论如何检查transform.rotation都是错误的..如果应该将其{{1} }。

然后,您实际要检查的值是transform.localEulerAngleseulerAngles


一个简单的替代方法是存储已旋转的值并钳制在该值上:

transform.localRotation

答案 1 :(得分:1)

public GameObject AltNeedleBright;
float MaxAltNeedleRotation = 135f; //smaller than this
float MinAltNeedleRotation = -65f; // bigger than this
public void Update ()
{
    float zAxis = AltNeedleBright.transform.localRotation.eulerAngles.z;
    float input = Input.GetAxisRaw("Vertical"); //Returns -1 or 1
    if(input > 0 && WrapAngle(zAxis) < MaxAltNeedleRotation)
    {
        AltNeedleBright.transform.Rotate(0, 0, 15 * Time.deltaTime);
    }
    if(input < 0 && WrapAngle(zAxis) > MinAltNeedleRotation)
    {
        AltNeedleBright.transform.Rotate(0, 0, -15 * Time.deltaTime);
    }
}

private static float WrapAngle(float angle)
{
    angle %= 360;
    if(angle > 180)
        return angle - 360;

    return angle;
}