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);
というふうに使える関数もある