LoginSignup
2
2

More than 3 years have passed since last update.

Unity 3D入門 #18 [マウスカーソルを中央にキープしつつカメラを移動する]

Posted at

FPSゲームなどでマウスを使用してカメラを回転させることがあります。

その際、同じ方向にカメラを回転させ続けるとマウスカーソルが画面端にぶつかり、それ以上マウスが動かずにカメラを動かせなくなる状態が発生しました。
この不具合に対して、マウスカーソルを中央に置きつつ、マウスカーソルの移動量の入力を受け付けたいと考えました。

if(Cursor.lockState == CursorLockMode.None){
    newAngle.y += ((Input.mousePosition.x - lastMousePosition.x) * y_rotate);
    newAngle.x -= ((Input.mousePosition.y - lastMousePosition.y) * x_rotate);
    // x_rotate, y_rotate -> カメラの移動スピード調整用変数

    // カメラがmixup以上に上を向かず、mindownよりも下を向かないようにする調整
    newAngle.x = Mathf.Min(newAngle.x, maxup);
    newAngle.x = Mathf.Max(newAngle.x, mindown);

    this.gameObject.transform.localEulerAngles = newAngle;
}

// マウスポインターが中央から離れすぎた場合
if(Mathf.Abs(Screen.width/2-Input.mousePosition.x) > 50 || Mathf.Abs(Screen.height/2-Input.mousePosition.y) > 50){
    Cursor.lockState = CursorLockMode.Locked;
    lastMousePosition = Input.mousePosition;
}else{
    Cursor.lockState = CursorLockMode.None;
    lastMousePosition = Input.mousePosition;
}

上のコードはマウスカーソルが中央から50以上離れたときに、マウスカーソルを中央に戻すコードとなります。
これをカメラにアタッチすることで、マウスが画面端にぶつかることなくマウスの入力を受け付けることができます。

Cursor.lockState = CursorLockMode.Locked はマウスポインターを画面中央に配置し、そこから動かなくする命令(実行するとマウスポインターは見えなくなる)
Cursor.lockState = CursorLockMode.None はマウスポインターを動かせる状態にする命令

このコードはつまり、Cursor.lockState = CursorLockMode.Locked によってマウスポインターを画面中央に移動させ、Cursor.lockState = CursorLockMode.None で画面中央からマウスを動かせるようにするというものです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2