问题描述
所以我有一个方向盘,它可以通过 A 和 D 按钮转动。我把它夹在一个负角和正角上。我还有一个代码,当角度不为零并且不按任何东西时,可以将轮子返回到它的原始旋转。我还有一个代码,当车轮接近夹紧角度时,它会减慢旋转速度。
这是我的车轮返回其原始位置的代码。 rotateBack 的值是一半,因为如果同时按下 A 和 D,轮子会卡在负角度。
if (Input.GetAxis("Horizontal") <1 && Input.GetKey(KeyCode.D) == false && !(angle < 1))
{
angle += rotateBack * Time.deltaTime;
if (angle > 0 )
{
rotateBack = -600f;
}
}
if (Input.GetAxis("Horizontal") < 0 && Input.GetKey(KeyCode.A) == false && !(negativeangle < 1))
{
angle += rotateBack * Time.deltaTime;
if (negativeangle > 0)
{
rotateBack = 300;
}
if(Input.GetKey(KeyCode.A) == false&& Input.GetKey(KeyCode.D) == false && negativeangle > 5)
{
angle += rotateBack * Time.deltaTime;
rotateBack = 300f;
}
向右旋转,角度为正,按应有的方式工作。但是当左转时,车轮在接近夹紧角度时忽略减速,而当车轮转至最大时,车轮抖动且不稳定。它超过了夹角。我注意到我的电脑功率越小,它就越晃动并且不平衡。
这是我的夹紧代码。有负角,但由于某种原因它不起作用。
angle = Mathf.Clamp(-120,angle,120);
angle = Mathf.Clamp(120,-120,angle);
wheel.transform.localRotation = Quaternion.AngleAxis(angle,Vector3.forward);
这是当接近夹紧角度时车轮减速时的代码。它不适用于负角。
if (angle < 100||negativeangle>100)
{
angle += Input.GetAxis("Horizontal") * Time.deltaTime * 500;
}
if (angle>80||negativeangle>80)
{
angle += Input.GetAxis("Horizontal") * Time.deltaTime * 5;
}
if (angle > 100||negativeangle > 100)
{
angle += Input.GetAxis("Horizontal") * Time.deltaTime * 1;
}
我尝试通过将角度更改为负角度来解决此问题,该角度被视为正角度,但并没有解决问题。
if (angle < 0)
{
negativeangle = -angle;
}
如何修复车轮越过夹角和晃动,使车轮在左侧超过某个角度时减速?除了这些东西,其他一切都在轮子上工作。
解决方法
不要为 angle
和 negativeangle
使用单独的变量,这只会使您的代码更加混乱,并且难以修复此类错误。相反,您应该有一个单一的 angle
变量,它可以是正的也可以是负的。
我建议你这样写你的更新函数:
private void UpdateWheel() {
// Get the input direction (using GetAxis,GetKey,etc.)
// Negative values are left,positive values right.
float input = Input.GetAxis("Horizontal");
if (input == 0f) {
// No input - return to the original position
if (angle != 0f) {
const float returnSpeed = 600f;
float newAngle = angle - returnSpeed * Time.deltaTime * Mathf.Sign(angle);
if (Mathf.Sign(angle) != Mathf.Sign(newAngle))
angle = 0f;
else
angle = newAngle;
}
}
else {
// Move the wheel in the input direction
const float maxAngle = 120f;
float absAngle = Mathf.Abs(angle);
float inputSpeedFactor;
if (absAngle <= 80f)
inputSpeedFactor = 500f;
else if (absAngle <= 100f)
inputSpeedFactor = 5f;
else
inputSpeedFactor = 1f;
angle = Mathf.Clamp(angle + input * inputSpeedFactor * Time.deltaTime,-maxAngle,maxAngle);
}
wheel.transform.localRotation = Quaternion.AngleAxis(angle,Vector3.forward);
}
此外,您没有正确使用 Mathf.Clamp
函数,参数的顺序是 (value,min,max)。