How to stop rotation by LerpAngle after -90°

徘徊边缘 提交于 2019-12-25 08:53:23

问题


I have colliders where i can turn to the sides and i want camera to rotate as a player turn to the side. I'm using Mathf.LerpAngle for that, but when I press the key for turn to side, camera is rotating in loop. How can I make rotation stop?

The problem is that everytime I turn player should go -90 degrees to the left +90 to the right and there will be more turns so i can't use functions for setting rotation.

I was already trying to make it stop by that if statement with (lAngle > 90f)

float lAngle = Mathf.LerpAngle(minAngle, lMaxAngle, Time.deltaTime);
float rAngle = Mathf.LerpAngle(minAngle, rMaxAngle, Time.deltaTime);

Quaternion leftRotation = Quaternion.Euler(new Vector3 (0, lAngle, 0));
Quaternion rightRotation = Quaternion.Euler(new Vector3 (0, rAngle, 0));

transform.position = player.transform.position + offSet;
transform.LookAt (player.transform);

if (Input.GetKeyDown (KeyCode.LeftArrow) && GameObject.Find("Player").GetComponent<PlayerMovement>().turn) {
    turnLeft = true;

} else if (Input.GetKeyDown (KeyCode.RightArrow) && GameObject.Find("Player").GetComponent<PlayerMovement>().turn) {
    turnRight = true;
}

if(turnLeft) {
    offSet = leftRotation * offSet;
    transform.position = player.transform.position + offSet;
    transform.LookAt (player.transform);

    if (lAngle > 90f)
        turnLeft = false;
}
if(turnRight) {
    offSet = rightRotation * offSet;
    transform.position = player.transform.position + offSet;
    transform.LookAt (player.transform);

    if (rAngle < -90f)
        turnRight = false;
}

回答1:


An alternative would be to use Quaternion.RotateTowards, as this allows rotations to negative values without the GameObject infinitely rotating (as it can't approach a negative value). Below you can see I'm storing the initial value of the GameObject's rotation, as a Vector3, before modifying this value whenever A or D keys are pressed. The rotation of the transform is then set to the result of Quaternion.RotateTowards.

public class FixedRotate : MonoBehaviour
{
    [SerializeField]
    private float   m_rotationAngle;
    [SerializeField]
    private float   m_rotationSpeed;
    private Vector3 m_targetRotation;

    public void Start()
    {
        m_targetRotation = transform.eulerAngles;
    }

    public void Update()
    {
        //Left
        if(Input.GetKeyDown(KeyCode.A))
            m_targetRotation.y -= m_rotationAngle;
        //Right
        if (Input.GetKeyDown(KeyCode.D))
            m_targetRotation.y += m_rotationAngle;

        transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(m_targetRotation), m_rotationSpeed);
    }
}

The unfortunate thing about this approach is that you can't specify the amount of time a rotation takes, only the incremental value of which the object will rotate by. An alternative approach would be to use Mathf.Clamp to add Time.deltaTime / rotationTime to the existing y rotation of the GameObject and stop once it's reached +/- 90. Hope this helps.



来源:https://stackoverflow.com/questions/35541760/how-to-stop-rotation-by-lerpangle-after-90

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!