【Unity】回転を滑らかにする

投稿者: | 2021-04-11

2つの方法で、オブジェクトを滑らかに回転させてみます。

Quaternion.RotateTowards

Quaternion.RotateTowardsメソッドの引数に、今の回転値と目的の回転値を渡します。また、目的の回転まで実際はどのくらいの角度だけ回転させるかを第三引数に渡します。

using UnityEngine;

public class RotateTest4 : MonoBehaviour
{    
    [SerializeField] float angle = 90f;
    [SerializeField] Vector3 axis = Vector3.up;
    [SerializeField] float step = 5;

    Quaternion targetRot;

    // Start is called before the first frame update
    void Start()
    {
        targetRot = Quaternion.AngleAxis(angle, axis) * transform.rotation;
    }

    void Update()
    {
        
        transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRot, step);

    }

}

例えば、第三引数に5を渡すと、5度ずつ回転します。

第一引数が現在の回転値でなく動かない場合、1回目で回転が止まるので、上昇する値を渡します。

using UnityEngine;

public class RotateTest4 : MonoBehaviour
{    
    [SerializeField] float angle = 90f;
    [SerializeField] Vector3 axis = Vector3.up;
    [SerializeField] float step = 5;


    Quaternion targetRot;
    Quaternion startRot;
    float sec;

    // Start is called before the first frame update
    void Start()
    {
        startRot = transform.rotation;
        targetRot = Quaternion.AngleAxis(angle, axis) * transform.rotation;
    }

    void Update()
    {
        sec += Time.deltaTime;

        transform.rotation = Quaternion.RotateTowards(startRot, targetRot, sec * step);
    }

}

Quaternion.Lerp

Quaternion.Lerpメソッドでも同じような方法で滑らかに回転させられます。Quaternion.Lerpメソッドでは、第三引数に0~1の値を渡します。

using UnityEngine;

public class RotateTest4 : MonoBehaviour
{
    [SerializeField] float angle = 90f;
    [SerializeField] Vector3 axis = Vector3.up;
    [SerializeField] float interpolant = 0.2f;

    Quaternion targetRot;

    // Start is called before the first frame update
    void Start()
    {
        targetRot = Quaternion.AngleAxis(angle, axis) * transform.rotation;
    }

    void Update()
    {

        transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, interpolant);

    }

}

こちらも開始の回転値を動かさないときは、時間などの値を使って回転させます

using UnityEngine;

public class RotateTest4 : MonoBehaviour
{
    [SerializeField] float angle = 90f;
    [SerializeField] Vector3 axis = Vector3.up;
    [SerializeField] float interpolant = 0.2f;

    Quaternion targetRot;
    Quaternion startRot;
    float sec;

    // Start is called before the first frame update
    void Start()
    {
        startRot = transform.rotation;
        targetRot = Quaternion.AngleAxis(angle, axis) * transform.rotation;
    }

    void Update()
    {
        sec += Time.deltaTime;   
        transform.rotation = Quaternion.Lerp(startRot, targetRot, sec * interpolant);
    }

}

コメントを残す

メールアドレスが公開されることはありません。