FPSのゲームと”全く同じ動き”をするカメラです.
いわゆるマウスカメラ?
#前置き
FPSカメラが欲しくなって記事を探すと,結構な確率でいざスクリプトをコピーしてカメラをぐりぐり回してみても視界がぐにょぐにょして上と下が分からなくなるモノに出くわすので,毎回修正して使用するのに苦労するので備忘録代わりに記事にすることにしました.
#実装のアイデア
- マウスの移動量をとってきてカメラの回転の移動量とする
- 軸ごとに回転させる
- 軸によっては動的にその向きを変える
特に3つ目が出来てないとカメラがぐにょぐにょしがち
#コード
コピってカメラにつけるだけ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraControl : MonoBehaviour
{
//マウス感度
float sensitivity=1f;
void Update()
{
CameraRotate_Mouse();
}
private void CameraRotate_Mouse()
{
//マウスの移動量取得
float x = Input.GetAxis("Mouse X") * sensitivity;
float y = Input.GetAxis("Mouse Y") * sensitivity;
//Y軸中心にカメラを回転
transform.RotateAround(transform.position, Vector3.up, x);
//上を見上げすぎて逆に後ろを向いちゃうのを防止.のつもりだったけど挙動変なので別途付け加えてください.
/*if (transform.forward.y + y > 0.9f)
y = 0.9f - transform.forward.y;*/
//カメラのX軸を中心に回転
transform.RotateAround(transform.position, transform.right, -y);
}
}
マウス感度とか制限とかはおまけで付けた.
取り除いてもFPSゲームと同じ動きをするカメラってところには変わりないので実際はもっとシンプルにできる.↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SimpleCameraControl : MonoBehaviour
{
void Update()
{
CameraRotate_Mouse();
}
private void CameraRotate_Mouse()
{
//マウスの移動量取得
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
//Y軸中心にカメラを回転
transform.RotateAround(transform.position, Vector3.up, x);
//カメラのX軸を中心に回転
transform.RotateAround(transform.position, transform.right, -y);
}
}
↑どう?めっちゃシンプルじゃね?
これだけでFPSっぽくマウスでカメラを動かせます.
#特に大事なところ
transform.RotateAround(transform.position, Vector3.up, x);
transform.RotateAround(transform.position, transform.right, -y);
・RotateAroundを使って回転軸を指定して回転を行う.
・マウスの移動量はx方向(左右の動き)とy方向(上下の動き)で取れる.
例:マウスを右に動かしたときにカメラが右を向くようにしたければ,マウスの移動量xをy軸中心の回転の移動量にする.
・Vector3.rightとtransform.rightで動き方が変化するので注意
#参考になりましたらLGTMよろしくお願いします
よろしくおねがいします