Web Analytics

こつこつエンジニア

現役アプリ開発者によるIT系特化ブログ

Unityでマウスの操作を行うとカメラが移動/回転/ドリーイン・ドリーアウトするようにしてみよう!(おまけでズームも)

f:id:madai21:20210720210353j:plain

はじめに

今回はUnityでマウスの操作でカメラ自体が移動回転ドリーイン・ドリーアウトを行うようにしてみたいと思います。
※おまけでドリーイン・ドリーアウトの代わりにズームもしてみます。

環境

Unity 2020.3.12f1を使います。
unity3d.com

Cameraで写す空間を用意する

この記事で作成した外からの光の影響を受けない閉鎖的な真っ暗な部屋を流用して用意することにしましょう。
madai21.hatenablog.com
具体的には

  1. Roomを50(W) x 50(H) x 50(D)から100(W) x 100(H) x 100(D)の領域に広げてあげます。
  2. SpotLightを削除して、PointLightを部屋に何個か配置させます。
  3. Sphereを赤色・青色・緑色の3つに増やす。

ということします。
それらを用意した空間で映されるカメラの映像は以下となります。
f:id:madai21:20210806004012p:plain

カメラ制御用スクリプトファイルを作成する

制御するのはMainCameraなので、MainCameraのAdd Componentからスクリプトを追加してあげます。
スクリプト名はCamCtrlとしましょう。
f:id:madai21:20210806004207p:plain
今回Assetsフォルダの下にMaterial用、Script用、Shader用のフォルダを用意してあげました。
作成したスクリプトファイルはAssetsフォルダの直下にいますので、ドラッグ&ドロップでScript用のフォルダに移動させてあげましょう。
こうすると種別にフォルダが分かれるので見やすいです^^
ファイルの移動もすべてUnity Editor上で行えるのでUnity Editorは楽で良いですね(`・ω・´)b
f:id:madai21:20210806004655p:plain

カメラ制御用スクリプトファイル(CamCtrl.cs)を編集する

順にスクリプトを編集していきます。

  1. マウスの左クリック押している間はカメラを移動させるようにする
  2. マウスの右クリック押している間はカメラを回転させるようにする
  3. マウスのホイール操作している間はカメラをドリーイン or ドリーアウトさせるようにする
  4. 【おまけ】マウスのホイール操作している間はカメラをズームイン or ズームアウトさせるようにする

マウスの左クリック押している間はカメラを移動させるようにする

処理としては以下のコードで実現できます。

float sensitiveMove = 0.8f;
cam = GetComponent<Camera>();
if (Input.GetMouseButton(0))
{
	float moveX = Input.GetAxis("Mouse X") * sensitiveMove;
	float moveY = Input.GetAxis("Mouse Y") * sensitiveMove;
	cam.transform.localPosition -= new Vector3(moveX, moveY, 0.0f);
}


左マウスボタンが押されている時にtrueが返却されます。

Input.GetMouseButton(0)


フレーム間のマウスX方向の移動量を値として取得できます。

Input.GetAxis("Mouse X")
フレーム間のマウスY方向の移動量を値として取得できます。
Input.GetAxis("Mouse Y")


値を大きくすると比例してカメラの移動量も大きくなります。

sensitiveMove


このコードでカメラオブジェクトの位置にマウスのX方向とY方向を加味させて、移動させています。

cam.transform.localPosition -= new Vector3(moveX, moveY, 0.0f)

マウスの右クリック押している間はカメラを回転させるようにする

処理としては以下のコードで実現できます。

float sensitiveRotate = 5.0f;
cam = GetComponent<Camera>();
if(Input.GetMouseButton(1))
{
	float rotateX = Input.GetAxis("Mouse X") * sensitiveRotate;
	float rotateY = Input.GetAxis("Mouse Y") * sensitiveRotate;
	cam.transform.Rotate(rotateY, rotateX, 0.0f);
}


右マウスボタンが押されている時にtrueが返却されます。

Input.GetMouseButton(1)


値を大きくすると比例してカメラの回転量も大きくなります。

sensitiveRotate


このコードでカメラオブジェクトをマウスのX方向とY方向に回転させています。
XとYが逆になるので注意!

cam.transform.Rotate(rotateY, rotateX, 0.0f)

マウスのホイール操作している間はカメラをドリーイン or ドリーアウトさせるようにする

処理としては以下のコードで実現できます。

float sensitiveZoom = 10.0f;
cam = GetComponent<Camera>();
float moveZ = Input.GetAxis("Mouse ScrollWheel") * sensitiveZoom;
cam.transform.position += cam.transform.forward * moveZ;


フレーム間のマウスホイールのスクロール量を値として取得できます。

Input.GetAxis("Mouse ScrollWheel")


値を大きくすると比例してカメラのドリーイン・ドリーアウト量も大きくなります。

sensitiveZoom

このコードでカメラオブジェクトをドリーイン・ドリーアウトさせています。

cam.transform.position += cam.transform.forward * moveZ

【おまけ】マウスのホイール操作している間はカメラをズームイン or ズームアウトさせるようにする

マウスのホイール操作でドリーイン・ドリーアウトの代わりにズームイン・ズームアウトすることもできます。
処理としては以下のコードで実現できます。

float sensitiveZoom = 10.0f;
cam = GetComponent<Camera>();
float moveZ = Input.GetAxis("Mouse ScrollWheel") * sensitiveZoom;
cam.fieldOfView -= moveZ;


このコードでカメラオブジェクトをズームイン・ズームアウトさせています。
Field Of Viewとは 視野角でこの値が小さいほど視野角が狭くなり、結果ズームインすることになります。
逆に大きい場合は視野角が広くなるので、ズームアウトすることになります。

cam.fieldOfView -= moveZ

カメラ制御用スクリプトファイル(CamCtrl.cs)の全コード

以下がCamCtrl.csを編集した全コードとなります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CamCtrl : MonoBehaviour
{
    private Camera cam;
    private Vector3 startPos;
    private Vector3 startAngle;
 
    // Start is called before the first frame update
    void Start()
    {
        cam = GetComponent<Camera>();
    }
 
    // Update is called once per frame
    void Update()
    {
        if (cam == null)
        {
            return;
        }
 
        float sensitiveMove = 0.8f;
        float sensitiveRotate = 5.0f;
        float sensitiveZoom = 10.0f;
 
        if (Input.GetMouseButton(0))
        {
            // move camera
            float moveX = Input.GetAxis("Mouse X") * sensitiveMove;
            float moveY = Input.GetAxis("Mouse Y") * sensitiveMove;
            cam.transform.localPosition -= new Vector3(moveX, moveY, 0.0f);
        }
        else if (Input.GetMouseButton(1))
        {
            // rotate camera
            float rotateX = Input.GetAxis("Mouse X") * sensitiveRotate;
            float rotateY = Input.GetAxis("Mouse Y") * sensitiveRotate;
            cam.transform.Rotate(rotateY, rotateX, 0.0f);
        }
 
        // zoom camera
        float moveZ = Input.GetAxis("Mouse ScrollWheel") * sensitiveZoom;
        cam.transform.position += cam.transform.forward * moveZ;
    }
}

さぁ動かしてみましょう^^
動画からは操作が分かりづらいですが、最初に左クリックによる移動、次に右クリックによる回転、続いてホイールによるドリーインとドリーアウトをしてから後は組み合わせて動かしています。

さいごに

今回はマウス操作によるカメラオブジェクトの制御を行いました。
これを応用すればキャラクタ自身の操作や目標地点への移動なんかもできるかもしれませんね^^

今回作成したUnityプロジェクトは以下の場所から取得できます。
ご自由にご利用下さい。
github.com