かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Unityで物体についていくカメラを実現する。ついでに右クリックドラッグで回転も

MMO RPGにありがちなカメラっぽい動きをさせてみた。

using UnityEngine;
using System.Collections;

public class CameraControl : MonoBehaviour
{
    // 追いかける対象物
    public Transform target;

    private Vector3 move = Vector3.zero;

    private Vector3 prevPosition = Vector3.zero;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire2"))
        {
            // 右ボタン押したときに初期位置リセット
            this.prevPosition = Input.mousePosition;
        }

        if (Input.GetButton("Fire2"))
        {
            // 右ボタンが押されてたら現在地と前の位置の差分をとって動いた距離に加算しておく
            move += Input.mousePosition - this.prevPosition;
        }
        
        // 前のマウスの位置を更新
        this.prevPosition = Input.mousePosition;

        // 画面の高さだけマウス動かしたときに何度回転させるか
        var anglePerPixelX = 180.0f / Screen.width;
        var anglePerPixelY = 60.0f / Screen.height;

        // 移動距離と上で求めた値をかけて角度を求める
        // X方向は360度回転させる
        var angleX = Mathf.Repeat(anglePerPixelX * move.x, 360.0f);
        // Y方向は10度~60度で
        var angleY = Mathf.Clamp(anglePerPixelY * -move.y, 10.0f, 60.0f);

        // 対象の位置に、回転とオフセットを加味
        var cameraPosition = this.target.position + Quaternion.Euler(angleY, angleX, 0) * new Vector3(0, 0, -5);

        // カメラの位置を更新してターゲットの方向を向かせる
        this.transform.position = cameraPosition;
        this.transform.LookAt(this.target);
    }
}

こんなビヘイビアをカメラにくっつけて、カメラを取り付けたいオブジェクトをtargetに設定したらおしまい。