当按住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);
}
}
答案 0 :(得分:2)
首先,您要处理Quaternion
。 Quaternion
具有 4 个组成部分x
,y
,z
和w
,在这里的行为并不像您期望的那样-永不改变或直接检查rotation.z
的值。
第二个错误:默认情况下,transform.Rotate
会在本地空间中进行旋转。因此,无论如何检查transform.rotation
都是错误的..如果应该将其{{1} }。
然后,您实际要检查的值是transform.localEulerAngles
或eulerAngles
。
一个简单的替代方法是存储已旋转的值并钳制在该值上:
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;
}