Unity Study

2025-11-15 Camera Rotation

NyumMa 2025. 11. 24. 18:04

 

카메라 local space에서

유니티는 카메라로부터 들어가는 방향이 z + 방향

카메라 보이는 방향 오른쪽이 +x 방향

위쪽 방향이 +y 방향

 

카메라에서 위 아래를 조절하는 요소(pitch)

x축을 기준으로 함(가로축)

카메라에서 좌우를 조절하는 요소는(yaw)

y축을 기준으로 함(높이 축)

 

 

 

 

마우스 이벤트 값 받아오기 vs 키보드 이벤트랑 다른 차이점

마우스 움직임에서 horizontal로 움직일 경우 좌우가 바뀌어야 하므로

y축을 기준으로 한 회전이어야함

마찬가지로 마우스 움직임에서 vertical로 움직일 경우 카메라의 상하가 바뀌어야 하므로

x축을 기준으로 한 회전이어야 함

 

InputAction.CallbackContext

Vs

InputValue

 

Callbackcontext는 유니티에서 지원하는 최신 input system 타입

Input action 이 실행될 때 전달되는 context(내용)

 

Move, Look, Jump와 같은 input action 이벤트를 정의했을 때

스크립트에서 On + ActionName을 통해 해당 함수의 동작을 이벤트 발생했을 때마다 실행함

 

.ReadValue<type>(); 방식을 통해 해당 값을 받아올 수 있음

 

Inputaction의 상태를 확인하거나 값을 읽어올 수 있다

상태 확인: Pressed, Started, Canceled

값 읽기: float, Vector2, Vector3 등등

 

InputValue는 단순히 input에 대한 값을 읽어오는 타입

Phase(pressed, started, canceled) 등의 상태를 알 수는 없고 단순 값만 받아온다

MouseEvent 에서 마우스의 Vector2 postion 등의 위치를 받아올 때 등

 

 

Wasd로 구현될때는 키보드을 눌렀는지 땠는지 등에 대한 phase 정보가 필요함

W 눌렀을 때 눌러짐 -> 누르는 상태 -> 때짐 의 과정으로 이벤트 처리됨

Phase를 사용해야 함

 

마우스 위치의 경우는 단순 해당 positon 또는 delta 값만 받아오면 되므로 inputvalue만 받아와도 무방함

 

[SerializeField]의 용도

[SerializeField] -> 타입 등을 private으로 정의했을 때 변수의 접근 제어 등을 다루는 키워드

Private 변수지만 인터페이스에 노출 시킴

코드적으로는 외부에서 접근 불가능하지만 에디터 상으로는 드롭앤 드롭 가능

Public과의 차이점은 public은 드래그 드롭 + 코드상으로 외부에서 접근 가능하지만

Serializefield private으로 처리되어 외부에서 접근 불가능하지만 인스펙터 상으로는 드래그 드롭 가능함

 

Private 쓰면 외부 인스펙터 상으로도 은닉 가능

Serializedfield를 사용하면 inspector에서 값 조정 가능

 

Rigidbody vs character controller

Rigidbody(강체)는 물리 엔진

기본적으로 physX물리 엔진 사용됨

-> NVIDIA 상용 3D 물리엔진

Rigidbody에서 position, Rotation, Collision, Force, Gravity 등을 다룰 수 있음

 

Rigidbody로 제여하는것과 transform으로 제어에는 차이가 있음

Transform사용시 오브젝트의 transform만 변경

Rigidbody 사용시 물리기반 계산 이동 처리

 

서로 다른 두 오브젝트의 collision 처리 할 때 rigidbody 사용하여 안정적인 충돌 구현 가능

 

Charactercontroller로 물체 제어 가능한데

물리엔진을 따로 적용되지 않고 플레이어의 입력에 따른 이동을 처리한다

-> rigidbody는 중력, 메쉬 형태에 대한 강체 무게중심 등이 적용되어 모든 오브젝트와 충돌 처리가 되지만 캐릭터 컨트롤러는 지형, 장애물, 등과 같은 오브젝트에 대해서만 충돌 처리 됨

 

캐릭터를 움직이거나 할때는 transform이나 rigidbody를 사용하지 않고 일반적으로 charactercontroller를 통해 위치를 움직이거나 한다.

 

카메라 회전의 경우는 charactercontrollertranslation 부분만 존재하기에 transform.을 통해서 카메라 회전 시키는게 맞다.

 

카메라 회전

1.     Input action asset에서 Look Action을 따로 정의함

2.     Look Action Action typevalue이고 Control Typevector2

Action typeinputaction이 어떤 종류의 입력을 나타내는지 알려주는 설정

Value, button, passthrough

Control type은 어떤 데이터를 읽을지 알려주는 설정

Vector2, vecotr3, quaternion, float

 

마우스 입력은 value값으로 하여 화면에서 xyvector2 를 입력 받으므로

Value, vector2로 각각 설정

Binding은 마우스의 이전 프레임에 대한 상대 위치를 받아와야 하므로

Delta[mouse]로 설정

3.     스크립트에서 OnLook 함수 정의, value 값을 inputvalue, 혹은 inpuaction.callbackcontext 등으로 해서 받아옴

4.     마우스에 대한 x 좌표, y 좌표의 변화량을 받아옴

5.     마우스의 x에 대한 부분은 horizontal 부분이므로 카메라의 y축을 기준으로 회전을 담당하고 마우스의 y에 대한 부분 vertical 부분이므로 카메라의 x축을 기준으로 회전을 담당

6.     마우스를 위로 올리면 deltay값은 양수, 아래로 내리면 deltay값은 음수

7.     근데 마우스를 위로 올렸을 때 x축으로 하는 카메라 회전에서 똑같이 위로 올라가야 함

8.     유니티는 왼손 좌표계를 사용, 근데 오일러 회전, quaternion 회전을 수학적으로 정의할 때  오른손 법칙 사용 -> 둘이 차이가 발생하므로 실제로 각도를 증가 시킬때는 -로 처리해 주어야 원하는 + 방향으로 카메라가 이동함

9.     높이에 대한 y축의 경우, 오일러 회전에서 xz축에 대한 부분은 그대로지만 y축은 부호 반전되어 행렬 적용됨, 따라서 y축에 대한 yaw 부분은 반전 안시키고 더해줘도 무방

è  좀더 확실하게 다시 알아볼 필요가 있다.

 

카메라 회전에 따른 wasd 종속

카메라 마우스로 회전하게 되면 wasd에 대한 기준이 카메라의 coordinate 기준으로 바뀌어 이동되어야 직관적임

화면이 움직였는데 wasd는 그냥 world 방향 그대로 처리되면 화면과 움직이는게 서로 따로 노는 느낌

따라서 charactercontroller transform을 처리할 때 카메라가 회전한 방향 기준으로 행렬 곱해준 다음에 wasd 입력에 따른 이동 처리를 해 주어야 함

1.     카메라의 transform 정보를 스크립트 상으로 받는다

2.     카메라의 transform에 대한 forward 방향과(+z방향) right 방향( +x 방향) 에 대한 벡터 값을 받는다

3.     카메라가 수평을 보고 있을때는 forward right 방향의 y성분이 0이겠지만 카메라를 상하로 움직이게 됬을때는 y값이 존재함 따라서 각 요소에 대한 y성분(높이)를 제거해주는 작업을 해야함

forward.y = 0f; right.y = 0f; forward.Normalize(); right.Normalize();

 

Vector3 move = forward * inputVector.y + right * inputVector.x

Forward, right 성분에 대해서 각각 ws , ad 값 곱해줌

Wasd 이벤트 + 마우스 회전 이벤트 발생할 때마다 갱신되면서 카메라 방향에 따른 wasd 방향 먹어서 보는 방향의 좌표공간에 맞게 wasd 적용됨

 

 

 

 

 

 

 

 

 

'Unity Study' 카테고리의 다른 글

2025-11-21 Project prefab  (0) 2025.11.24
2025-11-20 raycast  (0) 2025.11.24
2025-11-19 Jumping  (0) 2025.11.24
2025-11-17 running  (0) 2025.11.24
2025-11-13 movemnets  (0) 2025.11.24