vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

【Unity】カメラを回転させるメモ

はじめに

とあるきっかけで、マウス操作などに合わせてカメラをあれこれ回転させてみたくなったので、そのメモを残します。

カメラを回転させる

まずは画面上をマウスの左クリックボタンでドラッグしたときに、カメラが回転するようにしてみます。

using UnityEngine;

public class MainCtrl : MonoBehaviour {
    public Camera MainCamera;
    private Vector3 lastMousePosition;
    private Vector3 newAngle = new Vector3(0, 0, 0);

    private void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            // マウスクリック開始(マウスダウン)時にカメラの角度を保持(Z軸には回転させないため).
            newAngle = MainCamera.transform.localEulerAngles;
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(0))
        {
            // マウスの移動量分カメラを回転させる.
            newAngle.y -= (Input.mousePosition.x - lastMousePosition.x) * 0.1f;
            newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.1f;
            MainCamera.gameObject.transform.localEulerAngles = newAngle;

            lastMousePosition = Input.mousePosition;
        }

    }
}

これでカメラを中心に回転させることができます。

オブジェクトを中心に回転させる

例えばこれを、何らかのオブジェクトを中心に回転させたい場合。

その中心となる場所にGameObject(表示が不要なら空でOK)を置き、カメラはその子どもにし、回転処理を親オブジェクトに対して実行すればOKです。 (↑のコードのCameraをGameObjectに変更してください)

f:id:mslGt:20170218073417j:plain

対象物に向けて回転させる

マウス操作でカメラや親オブジェクトを回転させたあと、何らかのきっかけで元の角度に戻してみます。

一瞬で元に戻すだけであれば、ターゲット(今回はCube)に対してLookAtをしてあげればOK。
なのですが、今回は滑らかに動かしたかったため、DOTweenを使って実現してみました。

using UnityEngine;
using DG.Tweening;

public class MainCtrl : MonoBehaviour {
    public GameObject MainCamera;
    public GameObject TargetObject;

    private Vector3 lastMousePosition;
    private Vector3 newAngle = new Vector3(0, 0, 0);

    private void Start()
    {
        DOTween.Init(false, true, LogBehaviour.ErrorsOnly);
    }
    private void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            newAngle = MainCamera.transform.localEulerAngles;
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(0))
        {
            newAngle.y -= (Input.mousePosition.x - lastMousePosition.x) * 0.1f;
            newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.1f;
            MainCamera.gameObject.transform.localEulerAngles = newAngle;

            lastMousePosition = Input.mousePosition;
        }

        if (Input.GetMouseButtonUp(1))
        {
            var rotation = Quaternion.LookRotation(TargetObject.transform.position - MainCamera.transform.position);

            MainCamera.transform.DORotateQuaternion(rotation, 0.5f)
                .SetEase(Ease.InOutBounce)
                .OnComplete(()=> Debug.Log("Finished"));
        }
    }
}