テクノなまこ

科学の力

Unityで三人称視点移動+ズーム

Unityで3Dゲームを作るとき、ゲーム内でもblenderで操作するような3Dの視点移動ができてほしいと思ったので、調べて書いた。

参考

コード

視点の中心となるオブジェクトが「player」という名前だとする。カメラは、対象となるオブジェクトの子だとする。CamCtrl.csというC#スクリプトを作成して、中身を下コードに書き換えてカメラにアタッチすると、マウスのホイールでズームが、左クリックのドラッグで視点移動ができる。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamCtrl : MonoBehaviour
{
    private Camera cam;
    private Vector3 startPos;
    private Vector3 startAngle;
    public GameObject player = null;

    //初めに一度実行される部分
    void Start()
    {
        cam = this.GetComponent<Camera>(); //アタッチ先のオブジェクト(カメラ)から、カメラコンポーネントを呼び出してくる
        player = GameObject.Find("player"); //視点の中心となる"player"という名前のゲームオブジェクトを探してくる
    }

    //毎フレーム実行される部分
    void Update()
    {
        float sensitiveZoom =
            2.0f * ((player.transform.position - cam.transform.position).magnitude + 0.1f);
            //ズーム感度を視点の中心となるオブジェクトとの距離から計算する。
            //0.1を足しているのは、距離0でも感度が0にならずズームアウト可能にするため
        float sensitiveRotate = 5.0f;//三人称の視点回転感度
        
        if (Input.GetMouseButton(0)) //left click
        {
            Vector3 angle = new Vector3(
                Input.GetAxis("Mouse X") * sensitiveRotate,
                -Input.GetAxis("Mouse Y") * sensitiveRotate,
                0
            );

            cam.transform.RotateAround(player.transform.position, Vector3.up, angle.x);
            cam.transform.RotateAround(player.transform.position, transform.right, angle.y);
        }

        // zoom
        float moveZ = Input.GetAxis("Mouse ScrollWheel") * sensitiveZoom;
        cam.transform.position += cam.transform.forward * moveZ;
    }
}

Input.GetMouseButton(0)の代わりに

Input.GetMouseButton(1)

と書くと、右クリックのドラッグで視点移動できる。

このコードで使った関数の他に、カメラの移動には

cam.transform.localPosition -= new Vector3(moveX, moveY, 0.0f);
cam.transform.Rotate(rotateY, rotateX, 0.0f);

というふうに使える関数もある