유니티에서 마우스로 캐릭터의 시야를 움직이기 위해서는 마우스에 따라 플레이어의 transform의 rotation을 수정하게 만들 수 있는 스크립트를 작성하면 된다.
시야를 움직이기 전, 먼저 카메라를 플레이어의 자식오브젝트로 만들고 이동하기 스크립트를 작성하여 플레이어에게 적용한다.
(이동하기 스크립트는 https://greenchoco.tistory.com/223 참고)
이동구현이 적용된 플레이어의 스크립트에 회전구현 내용을 아래와 같이 추가해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Rendering;
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveSpeed; // 이동구현 - 속도
public float rotateSpeed; // 회전구현 - 회전속도
void Update()
{
float h = Input.GetAxis("Horizontal"); // 이동구현 - 수평
float v = Input.GetAxis("Vertical"); // 이동구현 - 수직
Vector3 dir = new Vector3 (h, 0, v); // 이동구현 - 이동 정규화를 위한 dir 선언
dir.Normalize(); // 이동구현 - dir의 이동 정규화
dir = transform.TransformDirection(dir); // 회전구현 - 플레이어 기준으로 dir 방향 조절(이걸 해야 마우스회전 방향으로 움직임)
rb.MovePosition(rb.position +(dir * moveSpeed * Time.deltaTime)); // 이동구현 - 물리작용을 이용해 이동
float mouseMoveX = Input.GetAxis("Mouse X"); // 회전구현 - 마우스의 좌우 움직임 입력을 숫자로 받아서 저장
transform.Rotate(0, mouseMoveX * rotateSpeed * Time.deltaTime, 0); // 회전구현 - 마우스가 움직인 만큼 Y축 회전
}
}
여기서 dir = tranform.TransformDirection(dir) 을 추가해야 마우스가 움직이는 방향대로 움직인다.
참고로 마우스 좌우 움직임은 X값이지만 회전할 때 좌우회전 rotation 값은 Y 이다. 그래서 Mouse X를 사용한 것이다.
이렇게 작성해준 위 플레이어에게 적용하고 플레이어 인스펙터의 JumpPower값을 500정도로 잡아준다.
(1도 회전이기 때문에 큰 숫자를 잡아주어야 회전하는 것이 느껴진다.)
이제 위아래 시야도 작성해주어야 하지만 위아래는 보이는데로 움직일 수 없고 단순히 보기만 하는 기능이기 때문에 플레이어가 아니라 플레이어에 속해있는 카메라에 스크립트를 작성해주어야 한다.
카메라에 속할 스크립트는 아래와 같이 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraRotate : MonoBehaviour
{
public float rotateSpeed; // 회전구현 - 회전속도
float tempX; // 회전구현 - 변수생성
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float mouseMoveY = Input.GetAxis("Mouse Y"); // 회전구현 - 위아래 움직임 숫자로 저장
transform.Rotate(-mouseMoveY * rotateSpeed * Time.deltaTime, 0, 0); // 회전구현 - 마우스가 움직인 만큼 x축 회전
if (transform.eulerAngles.x > 180) // 회전구현 - 만약 x의 각도가 180을 넘는다면
{
tempX = transform.eulerAngles.x - 360; // 회전구현 - 360을 빼서 음수로 저장
}
else // 회전구현 x의 각도가 180을 넘지 않는다면
{
tempX = transform.eulerAngles.x; // 회전구현 - 그대로 저장
}
tempX = Mathf.Clamp(tempX,-30, 30); // 회전구현 - 음수를 포함한 x의 각도를 -30 ~ 30도로 제한
transform.eulerAngles = new Vector3 (tempX, transform.eulerAngles.y, transform.eulerAngles.z); // 회전구현 - 제한된 값을 eulerAngles.x에 적용
}
}
위 스크립트에서 rotation 대신 Vector3 자료형인 eulerAngles 라는 변수를 사용한 이유는 스크립트에서 사용하는 roration과 인스펙터 tranform에 있는 rotation의 기준이 다르기 때문이다.
인스펙터 tranform의 기준에 맞는 각도를 사용하기 위해 eulerAngles를 사용한 것이다.
우리가 고개를 숙이거나 들 때 제한이 있는 것처럼 위 스크립트에서도 if else 함수를 이용해 제한을 걸어두었다.
eulerAngles 는 0~360 각도 사이의 값만 처리할 수 있다. 따라서 -10은 350도, -90은 270도로 변환한다.
제한하는 기능을 가힌 Mathf 구조체의 함수 Clamp는 (제한하려는 값, 최솟값, 최댓값) 인수를 지정하면 제한된 값을 반환한다.
따라서 temp의 값을 -30에서 30도 사이로 제한된다.
마지막 tranform.elulerAngles = new Vector3 에서 인수를 (tempX, transform.eulerAngles.y, transform.eulerAngles.z) 를 써주었는데, transform.eulerAngles.y, transform.eulerAngles.z 를 꼭 넣어줘야 좌우회전에 제약이 없다.
'유니티 C# > 3D 입문공부' 카테고리의 다른 글
유니티 기초 - 오브젝트 두개를 정확하게 빈틈없이 붙이기 (0) | 2024.11.10 |
---|---|
유니티 기초 - 카메라 1인칭으로 만들기 (0) | 2024.05.19 |
유니티 기초 - 오브젝트 색상 변경하기(+핑크색 오류) (1) | 2024.04.26 |
3. 메인 씬 만들고 캐릭터 추가해보기 (0) | 2023.03.23 |
2. 유니티 3D 무료 튜토리얼 임포트 하기 (3D Beginner: Tutorial Resources) (0) | 2023.03.21 |
댓글