カーソルが邪魔になったり、画面外にカーソルが出てしまうなどの解決方法をいくつか紹介
画面上でマウスカーソルを動かしてカメラ操作をする際に、カーソルが邪魔になる場合や、画面外に行かないようにするには、カーソルを非表示にして中央に固定し、相対的なマウス移動量を使ってカメラを操作する方法があります。
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float sensitivity = 300f;
private float rotationX = 0f;
private float rotationY = 0f;
void Start()
{
// カーソルを非表示にしてロックする
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void Update()
{
// マウスの移動量を取得
float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
// カメラの回転を計算
rotationY += mouseX;
rotationX -= mouseY;
rotationX = Mathf.Clamp(rotationX, -90f, 90f); // カメラの上下制限
// カメラの回転を適用
transform.localRotation = Quaternion.Euler(rotationX, rotationY, 0f);
// ESCキーを押したらカーソルロックを解除
if (Input.GetKeyDown(KeyCode.Escape))
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
}
CursorLockMode.Locked
に設定すると、カーソルが画面の中央に固定され、マウスの移動量が相対的に扱われます。false
に設定することで、カーソルが見えなくなります。このコードでは、ESC
キーを押すことでカーソルロックを解除し、カーソルを再び表示することができます。
カーソルを表示したまま、画面外に出ないように制限することも可能です。
using UnityEngine;
public class CursorBoundaries : MonoBehaviour
{
void Start()
{
// カーソルを画面内に制限
Cursor.lockState = CursorLockMode.Confined;
}
void Update()
{
// ESCキーで制限解除
if (Input.GetKeyDown(KeyCode.Escape))
{
Cursor.lockState = CursorLockMode.None;
}
}
}
あるタイミングでカーソルをロックしてカメラ操作に集中し、別のタイミングでカーソル操作に切り替えるといった方法もあります。
using UnityEngine;
public class ToggleCursorLock : MonoBehaviour
{
private bool isLocked = true;
void Start()
{
ToggleCursorLockState();
}
void Update()
{
// スペースキーでカーソルロックを切り替え
if (Input.GetKeyDown(KeyCode.Space))
{
isLocked = !isLocked;
ToggleCursorLockState();
}
}
void ToggleCursorLockState()
{
if (isLocked)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
}
false
でカーソルを非表示、true
で表示する。using UnityEngine;
namespace Often
{
public class CursorCtrl : MonoBehaviour
{
void Start() {
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
void Update() {
if (Input.GetKeyDown(KeyCode.Escape)) {
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
}
if (Input.GetMouseButtonDown(0)) {
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
}
}
}