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 で画面中央からマウスを動かせるようにするというものです。