かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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に設定したらおしまい。