0

AボタンとDボタンで回すハンドルがあります。私は負と正の角度でそれを固定しました。角度がゼロではなく、何も押していないときに、ホイールを元の回転に戻すコードもあります。ホイールがクランプ角度に近づくと回転を遅くするコードもあります。

ホイールが元の位置に戻るコードは次のとおりです。A と D を同時に押すと、ホイールが負の角度で動かなくなるバグがあるため、rotateBack の値は半分の量です。

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;
    }

角度が正である右への回転は、正常に機能します。しかし、左に曲がると、クランプ角度に近づくとホイールは減速を無視し、ホイールを最大に回転させると、ホイールが揺れて安定しません。クランプ角度を超えています。持っている PC の性能が低いほど、揺れが大きくなり、バランスが崩れることに気付きました。

これが私のクランプコードです。負の角度がありますが、なぜか機能しません。

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;
    }

固定角度を超えてホイールが揺れて、左側の特定の角度を超えるとホイールが減速するようにするにはどうすればよいですか? これらのことを除いて、他のすべてはホイールで機能します。

4

1 に答える 1

0

と に別々の変数を使用しないでください。これは、コードをより混乱さanglenegativeangle、このようなバグの修正を難しくするだけです。angle代わりに、正または負の単一の変数を使用する必要があります。

update 関数を次のように書くことをお勧めします。

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関数を正しく使用していません。引数の順序は (値、最小、最大) です。

于 2021-06-14T23:00:59.500 に答える