가장 먼저 정중앙에서 커서가 벗어나지 않도록 고정시킨다.
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
Cursor.lockState
public Transform firePos;
Vector3 dir;
Ray ray;
void Start()
{
// 총구 위치 찾기
firePos = GameObject.Find("Muzzle").transform;
dir = Camera.main.ScreenPointToRay(Input.mousePosition).direction;
ray = new Ray(firePos.position, dir);
}
Camera.main.ScreenPointToRay(Input.mousPosition)
: 카메라에서부터 현재 마우스 위치까지에 대한 Ray. 위에서 커서 고정했으므로 카메라 ~ 화면 정중앙까지에 대한 Ray라고 볼 수 있다.
ray = new Ray(firePos.position, dir)
: 위에서 구한 Ray 방향으로 총구 위치에서 시작하는 Ray 생성.
public class MouseMove : MonoBehaviour
{
public float turnSpeed = 4.0f;
public float moveSpeed = 2.0f;
private float xRotate = 0.0f;
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void Update()
{
MouseRotation();
}
void MouseRotation()
{
//// 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
// 현재 y축 회전값에 더한 새로운 회전각도 계산
float yRotate = transform.eulerAngles.y + yRotateSize;
// 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 회전할 양 계산(하늘, 바닥을 바라보는 동작)
float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
// 위아래 회전량을 더해주지만 -45도 ~ 80도로 제한 (-45:하늘방향, 80:바닥방향)
// Clamp 는 값의 범위를 제한하는 함수
xRotate = Mathf.Clamp(xRotate + xRotateSize, -45, 80);
// 카메라 회전량을 카메라에 반영(X, Y축만 회전)
transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
}
}