-90°后如何停止LerpAngle旋转 [英] How to stop rotation by LerpAngle after -90°

查看:128
本文介绍了-90°后如何停止LerpAngle旋转的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有对撞机,我可以将其转向侧面,并且我希望摄像机随着玩家转向侧面而旋转.我正在使用Mathf.LerpAngle,但是当我按下向侧面转键时,相机正在循环旋转.如何使旋转停止?

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?

问题在于,每当我转弯时,播放器应向左-90度+向右90度,并且转弯次数更多,因此我无法使用用于设置旋转角度的功能.

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.

我已经在试图用(lAngle> 90f)的if语句来阻止它

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

推荐答案

一种替代方法是使用

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

这种方法的不幸之处在于,您无法指定旋转所花费的时间,只能指定对象旋转所用的增量值.另一种方法是使用Mathf.Clamp将Time.deltaTime/rotationTime添加到GameObject的现有y旋转中,并在达到+/- 90时停止.希望如此.

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.

这篇关于-90°后如何停止LerpAngle旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆