-
[Unity 3D URP] 캐릭터 컨트롤러를 알아보자 1Unity 3D 2023. 3. 24. 17:19
유니티 안에는 Character Controller 라는 컴포넌트가 있다.
캐릭터 컨트롤러는 물체의 움직임이 필요한 게임을 만들어야 할 때 사용하는 요소 중 하나이다.
캐릭터 컨트롤러의 기능 캐릭터 컨트롤러(character controller)와 리지드바디(rigidbody) 의 장단점을 간단하게 설명하겠다.
리지드바디 컴포넌트를 사용하면 물리적인 표현이 자연스럽게 적용이 되어
최소한의 스크립트로만 움직임을 구현할 수 있다.
리지드바디 안에 is Kinematic 이라는 기능이 들어있는데, 이 기능을 사용하게 되면
다른 오브젝트로부터 힘을 받았을 때 반응을 하지 않고 중력 또한 적용되지 않는다.
하지만 다른 오브젝트에게 힘을 가할 수는 있다.
캐릭터 컨트롤러 컴포넌트는 더 다양한 물리 표현을 할 수 있다.
중력이나 다른 오브젝트로부터의 힘에 영향을 받지 않기 때문이다.
하지만 물리적인 표현을 하려면 스크립트 안의 코드를 통해서 구현해야 한다.
이 두 컴포넌트를 같이 사용해서 단점 보완이 가능하다.
간단한 맵을 구현한 샘플 씬에서 직접 적용시키면서 이해해보자.....
그러려면 일단 간단한 맵 부터 만들어야지.........
★ 1인칭 캐릭터 만들기
시야 이동 구현 (1인칭) → 카메라 위치에 따라서 1인칭, 3인칭 등 다양한 시점으로 설정할 수 있다.
캐릭터 이동 구현
점프 구현 ( rigidbody 기능 구현 )
Unity Asset Store 에서 무료로 다운 받은 Character Controller URP 에셋이다.
그리고 Player를 구현해줄 캡슐 오브젝트를 생성했다.
그리고 캐릭터 컨트롤러를 사용할 예정이기 때문에
자동적으로 생성되어 있던 Rigidbody 컴포넌트는 삭제하고
Player 클릭 → Add Component → Character Controller 를 추가해준다.
1인칭 시점으로 만들려면 Player 의 시야 = 화면 시야 가 되어야 한다.
Main Camera 를 Player에 상속시키면 된다.
Player가 보는 세상 ( 게임씬 화면 ) 1인칭으로 잘 구현이 됐다.
이제 이 시야가 플레이어의 시선대로 이동할 수 있게 구현해보자.
메인 카메라에 넣을 스크립트를 만들어서 적용한다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCamera : MonoBehaviour { // 플레이어 오브젝트 public Transform player; // 마우스 움직임 보정값 [SerializeField] private float sensivity = 100; // 메인 카메라의 x축 회전값 private float rotateX = 0; private void Start() { // 마우스 커서 없애기 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; } void Update() { // 플레이어(카메라)를 좌우로 회전 float mouseX = Input.GetAxis("Mouse X") * sensivity; // 카메라를 상하로 회전 float mouseY = Input.GetAxis("Mouse Y") * sensivity; // 플레이어 회전 player.Rotate(Vector3.up * mouseX * Time.deltaTime); // 카메라 회전 // x축 기준으로 회전하는 게 위아래 회전 rotateX -= mouseY * Time.deltaTime; } }
시야 이동할 때 같이 움직일 Player 와 움직이는 속도를 선언한다.
좌우로 움직이면 Player도 같이 회전하는 것이다.
메인 카메라의 회전값을 받을 변수 rotateX도 같이 초기화했다.
Axis 의 Mouse X 참고 float mouseX는 Axis의 Mouse X (마우스 좌우 움직이는 키값)를 선언한 속도로 받아 저장하는 변수이다.
float mouseY도 Axis의 Mouse Y (마우스 상하 움직이는 키값)를 선언한 속도로 받아 저장한다.
Input.GetAxis("string Name"); 함수는 말 그대로 Axis의 string 값을 받아서 입력하는 함수다.
키 값은
Edit → Project Settings → Input Manager 에서 확인할 수 있다.
그리고 Player는 변수 mouseX 의 회전값이 들어온 만큼 회전한다.
메인카메라의 x축 (빨간색) = 위 아래 회전 rotateX 는 메인카메라의 x축 회전값을 받을 변수이다.
mouse Y의 회전값을 매 프레임마다 누적하여 받는다.
rotateX += mouseY * Time.deltaTime;
+= 덧셈으로 누적을 받으면 마우스가 위로 향할 때 회전을 아래로 하고
마우스가 아래로 향할 때 회전을 위로 한다...
rotateX -= mouseY * Time.deltaTime;-= 뺄셈으로 수정을 했더니 정상 작동 함
마우스 커서 관련 글은 여기를 참고하자.
마우스 커서(Cursor) 숨기기 (tistory.com)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCamera : MonoBehaviour { // 플레이어 오브젝트 public Transform player; // 마우스 움직임 보정값 [SerializeField] private float sensivity = 700; // 메인 카메라의 x축 회전값 private float rotateX = 0; private void Start() { // 마우스 커서 없애기 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; } void Update() { // 플레이어(카메라)를 좌우로 회전 float mouseX = Input.GetAxis("Mouse X") * sensivity; // 메인 카메라를 상하로 회전 float mouseY = Input.GetAxis("Mouse Y") * sensivity; // 플레이어 회전 player.Rotate(Vector3.up * mouseX * Time.deltaTime); // 카메라 회전 rotateX -= mouseY * Time.deltaTime; // 회전 고정 rotateX = Mathf.Clamp(rotateX, -90, 45); // 오일러 값을 쿼터니언으로 변환 transform.localRotation = Quaternion.Euler(rotateX, 0, 0); } }
메인 카메라의 회전값을 고정해주기 위해
Mathf.Clamp 함수를 사용했다.
메인 카메라는 플레이어의 자식 오브젝트기 때문에 transform.localRotation이다.
상속된 오브젝트는 부모 오브젝트의 좌표를 기준으로 하기 때문이다.
메인 카메라는 x좌표 외엔 움직이지 않기 때문에 (위 아래 회전만 구현) y,z 의 값은 0으로 고정시킨다.
transform 은 기본적으로 쿼터니언 값으로 나타나기 때문에 오일러 값으로 변환해준다.
Mathf.Clamp 함수와 오일러 각 (Euler Angle) 에 대한 간단 정보는
[Unity 2D] Fly Bird 회전 구현하기 (tistory.com)
여기에서 보면 참고가 될 수도 있고 안 될 수도 있고 ~~
전체 코드
↓
더보기PlayerCamera.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCamera : MonoBehaviour { // 플레이어 오브젝트 public Transform player; // 마우스 움직임 보정값 [SerializeField] private float sensivity = 100; // 메인 카메라의 x축 회전값 private float rotateX = 0; private void Start() { // 마우스 커서 없애기 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; } void Update() { // 플레이어(카메라)를 좌우로 회전 float mouseX = Input.GetAxis("Mouse X") * sensivity; // 카메라를 상하로 회전 float mouseY = Input.GetAxis("Mouse Y") * sensivity; // 플레이어 회전 player.Rotate(Vector3.up * mouseX * Time.deltaTime); // 카메라 회전 rotateX -= mouseY * Time.deltaTime; // 회전 고정 rotateX = Mathf.Clamp(rotateX, -90, 45); // 오일러 값으로 변환 transform.localRotation = Quaternion.Euler(rotateX, 0, 0); } }
'Unity 3D' 카테고리의 다른 글
[Unity 3D URP] 캐릭터 컨트롤러를 알아보자 2 (0) 2023.03.27