Unity Study

2025-11-23 3rd perosn camera(2)

NyumMa 2025. 11. 24. 18:24

Unity 3rd person Camera

 

월드 에디터 공간에서 처음 player와 카메라 간의 거리차가 있음

이를 delta로 부여하려고 함

Player + delta(cam – player)를 통해 cam의 위치를 계산 가능

 

스크립트에서 초기에 delta = cam-playerawake, onenable, start 중 어디에 초기화 해야 할지가 궁금해짐

 

Awake

유니티 스크립트가 활성화가 되어 있든 안되어 있든 실행되는 코드, awake 안에서는 어떤 코드가 먼저 실행될지에 대한 순서 보장이 안되어 있음,

플레이어 오브젝트 등이 아직 준비가 안되어 있을 수도 있다. 플레이어 위치 읽어야 하는데 실행되지 않았다면 초기 위치가 null 값이 된 형태로 계산되어 문제 발생

용도

변수 초기화, 스크립트 참조 연결

 

OnEnable

오브젝트 활성화될 때마다 호출됨

OnDestroy로 캐릭터가 죽었다가 OnEnable로 다시 살면 호출됨

오브젝트 활성화 될 때마다 호출되기 때문에 초기 1회 계산해야 하는 목적에 있어서는 사용하는데 맞지 않음

용도

UI갱신, 이벤트 발생

 

Start

모든 awakecontext가 끝나고 update 전에 한번 호출됨

 

 

 

Transform에서 기저 변환하는 행렬처리 함수

 

TransformPoint:

로컬 좌표축의 위치 벡터에 대해 글로벌 좌표축 기준으로의 벡터 결과 값을 게산받음

Global Pos.TransformPoint(local position)

예를 들어 글로벌 좌표에 cube 오브젝트가 translation(0,0,4)rotation(1,0,0) scale(1,2,1) 있는 채로 있고 해당 오브젝트를 0,0,-2로 로컬 기준으로 변환 처리 하고싶다고 할 때 TRS를 고려하여

글로벌 좌표에 있는 object를 로컬 공간에서의 변화를 통해 글로벌좌표 변환처리 해 준다

Scale 처리

Rotation 처리

Translation 처리

 

TransformDirection

글로벌 좌표의 방향과 로컬 공간의 방향 부분에 대한 선형 변환 부만 고려

, Rotation 처리만 계산하는 것

만약 transformpoint와 동일하게 역할을 처리하고 싶다면

Player.location + Player.TransformDirection(local direction) 처리 하면 T + R 에대한 부분까지 적용된 상태임

But, scale에 대한 부분은 처리 안된 채로 있는 것

 

TransformVector

Transformdirection과 유사하지만 벡터의 길이를 고려하므로 scale 항을 같이 고려한 함수임

T + transformvector하면 정확하게 transformpoint와 똑같은 역할을 하게 된다.

 

 

해당 부분을 통해

카메라의 초기 위치를 1인칭, 3인칭에 따라서 계산할 때

1인칭일 때 Cam.position = player.TransformPoint(CameraDelta);

3인칭일 때 Cam.position = player.TransformPoint(CameraDelta + CameraBack);

로 계산 가능하다.

 

Camerarotation 구현시 회전처리를 player.localtransform으로 pitchyaw 둘다 같이 바뀌도록 했는데 이렇게 되면 카메라 회전하면서 player rotation이 변동되지 않으므로

Pitch -> camera 회전만 담당

Yaw -> parent capsule을 돌게 하여 자식인 카메라도 같이 돌아가도록 처리

로 분리시켜 놓는다.

 

1인칭 3인칭일때의 현재 로직에 대한 문제점

기존 코드의 경우 1인칭을 기준으로 한 카메라 로직 처리를 하였음

Movement.cs

머리에 붙어있는 카메라가 바라보는 방향을 기준으로 forward 벡터와 right 벡터를 구한 후

y축을 제거하고 이를 정규화 벡터를 기준으로 하여 wasd값에 곱하여 처리함

 

camerarotation.cs

머리에 붙어 있기에 머리point를 기준으로 마우스 회전에 따른 카메라 회전을 구현함

 

 

3인칭에서

Movement

Wasd랑 마우스의 회전을 서로 분리시켜놓아서 wasd는 글로벌 좌표 기준으로 움직이면서 마우스는 따로 회전되어 처리되도록 하기를 원함

캐릭터를 회전시키는 주체는 wasd가 되어야 하고

카메라는 단지 주변 환경을 보기 위한 도구로써 사용

Camerarotation

카메라가 player를 기준으로 돌아야 함, lookat 활용

마우스 스크롤에 따라 플레이어를 스무스 하게 줌인 아웃 하면 좋겠음, 특정 크기까지만 가능

카메라 FOV값 달라져야 함

 

CameraSwitch에서 바뀐 값에 따라서 해당 값을 글로벌하게 state를 관리할 수 있도록 만들어 주어야 함

 

->디자인 패턴 중 observer 패턴을 통해 camera state subject로 이를 참조하는 observer에게 상태 변화를 알려주는 방식으로 처리할 수 있다.

 

한 객체의 상태가 변했을 때 해당 변화를 객체에게 통보하는 디자인 패턴

 

Subject: 상태를 가지고 있고 알림을 보내는 대상(camerastate)

Object: Subject의 상태 변화를 받아 동작

 

유니티에서 public static event Action을 통해서 옵저버 패턴을 구현할 수 있음

 

다음에 정리 해야 할거

0.

Eventaction에 메서드 등록, 해제관계

값 인자 전달 관계 처리

1.

플레이어 이동 update에 처리

카메라 회전 이동은 lateupdate처리

2.

입력 이벤트 받은 즉시 마우스 이벤트 계산으로 코드 수정

Update에 마우스 입력 받도록 하지 않고 OnLook 안에 바로 처리계산

Eventupdate간의 즉각 처리 차이

3.

1인칭 , 3인칭에 따른 x축 회전 clamp 제한 값 다르게 설정

4.

Cameraswitch 부분에서

현재 카메라의 transform 변환 로직을 반영해 놓았는데 이를 camerarotation 부분으로 따로 빼도록 처리하기

è  Toggle 용도로만 사용하기

 

스크립트 업데이트시 과거 스크립트랑 섞여서 날짜마다 과정같은게 합쳐져서 점점 크기가 커지는데 이를 공부 목적으로 날짜마다 스크립트 변경 사항 등을 부여하려면 어떻게 하는게 좋을지

-> Git을 사용하자

 

 

 

 

 

 

 

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

2025-11-26 3rd person camera(3) - LookAt, Quaternion  (0) 2025.11.26
2025-11-24 version control  (0) 2025.11.24
2025-11-22 3rd person camera  (0) 2025.11.24
2025-11-21 Project prefab  (0) 2025.11.24
2025-11-20 raycast  (0) 2025.11.24