Unityで3Dゲームを作るとき、ゲーム内でもblenderで操作するような3Dの視点移動ができてほしいと思ったので、調べて書いた。
参考
- 【Unity】カメラをマウスに連動させて回転させよう!|Camera入門③ – XR-Hub
コード例の8割くらいはこの方のコピーで、変えた部分はホイールのズームと、縦の移動の符号のみ(blenderで慣れた向きにしたかった)。この記事の方が私の記事より解説が丁寧だと思うのでこっちを読んだ方が良い。 - Unityでマウスの操作を行うとカメラが移動/回転/ドリーイン・ドリーアウトするようにしてみよう!(おまけでズームも) - こつこつエンジニア
この方のズームの実装を参考に、オブジェクトから離れるにつれてズーム倍率が大きくなるようにした。
コード
視点の中心となるオブジェクトが「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);
というふうに使える関数もある