使用Slerp进行Unity2D平滑旋转

时间:2016-01-02 14:39:24

标签: c# unity3d

我正在制作一个游戏对象的巡逻脚本。我希望物体能够平稳,缓慢地旋转,以面对它的巡逻目标。

不幸的是,该对象会抓住它的新位置。

我在团结论坛上问过,无法得到答案。

如何让旋转平稳而缓慢?

这是我的代码。

    public Transform[] patrol;
    public int Currentpoint;
    public float moveSpeed;
    public Vector3 john = new Vector3(0,1,0);
    public Vector3 targetLocation;

    void Start()
    {

    }
    void Update()
    {
        if (transform.position == patrol [Currentpoint].position) {
        Currentpoint++;
        if (Currentpoint >= patrol.Length) {
            Currentpoint = 0;
        }
        targetLocation = patrol [Currentpoint].position;
        Vector3 targetDir = targetLocation - transform.position;
        float angle = Mathf.Atan2 (targetDir.y, targetDir.x) * Mathf.Rad2Deg;
        transform.localRotation = Quaternion.SlerpUnclamped (transform.localRotation, Quaternion.AngleAxis (angle, Vector3.forward), Time.deltaTime * 3);
        Debug.Log (Currentpoint);
    }

    transform.position = Vector3.MoveTowards (transform.position, patrol [Currentpoint].position, moveSpeed * Time.deltaTime);
    }

3 个答案:

答案 0 :(得分:0)

public static Quaternion Slerp(Quaternion a,Quaternion b,float t);参数t被钳位到[0,1]

的范围内

你的时间3是把它扔掉所以它不在0-1之间......我相信

答案 1 :(得分:0)

如果您喜欢某些数学,那么我会为您提供解决方案。

您希望围绕另一个旋转对象,例如地球和太阳。也许可以使用其他一些解决方案,但我会通过LookAt和圆的参数方程来实现。

x = r * cos(theta) + displacementX

y = r * sin(theta) + displacementY

其中r是半径,距您的距离 displacementXdisplacementY是与原点的距离。如果两者(displacementXdisplacementY)都为0,那么它将围绕origin (0,0)旋转。换句话说,displacementXdisplacementY是轮换的起源。

在对象(地球)脚本中,按照以下步骤进行操作

public Transform _sun;
float _theta = 0;

void Start ()
{
    StartCoroutine ("ChangeAngle");
}

void Update ()
{
    transform.LookAt (_sun);
    float newX = (5 * Mathf.Cos (_theta)) + _sun.position.x;
    float newY = (5 * Mathf.Sin (_theta)) + _sun.position.y;

    transform.position = new Vector3 (newX, newY, _sun.position.z);
}

IEnumerator ChangeAngle ()
{
    while (true) {
        yield return new WaitForSeconds (0.01f);
        _theta += 0.1f;
        if (_theta >= 360)
            _theta = 0;
    }
}

你可以进一步玩它

答案 2 :(得分:0)

我找到了答案,

事实证明,将旋转指令放在if语句中是个问题。我将旋转转换为函数,然后将函数放置在同一循环段中的一般巡逻运动之上。

我不知道为什么会有效。

感谢大家的帮助。