본문 바로가기

UNITY

UNITY_20231019[팀 과제, 오브젝트의 리깅]

팀 프로젝트에서 구현된 플레이어 오브젝트는 아래와 같은 모델링을 갖고 있다.

마네킹 같은 모습, 각 관절마다 위치 이동, 회전도 가능하다.

사실, 싱글 플레이 FPS에서 이런 오브젝트를 굳이 채택할 필요는 없다. 플레이어가 자신의 모습을 볼 경우가 아예 없기 때문이다.(게임 내에 거울같은 모습이 비치는 오브젝트가 없는 한)

 

이런 자세한 리깅이 돼있는 오브젝트(대표적으로 인간형)는 다양하고 역동적인 애니메이션을 추가할 수 있다는 점에서 UX를 대폭 향상시킨다는 장점을 갖고 있다. 


FPS에서 인간형 다관절 3D 오브젝트(인간형 오브젝트라고 부르겠다)의 이동은 어떻게 설정하면 좋을까? 회전은 어떻게 처리할까?

 

우선 오브젝트의 이동은 기존 방법과 거의 차이가 없다. WASD 누르면 그 방향대로 움직이면 된다. FPS니까 측방/후방 이동 시에 오브젝트가 회전하면 안된다. 게걸음/ 뒷걸음질로 이동해야 한다.


내가 공부하면서 본 모든 인간형 오브젝트는 목 관절이 구현돼 있다. 그럼 플레이어의 눈이 될 카메라를 목 관절 오브젝트 하위 오브젝트로 설정하고, 목 관절보다 약간 위, 인간형 오브젝트의 눈높이에 맞추면 될 것이다.

오브젝트의 시야 회전이 있을 때는 목 관절을 회전시키면 되겠다. 물론 목이 상하로 일정치 이상 꺾이지 않도록 목의 Rotation.X값을 Mathf.Clamp로 제한해야 한다.

 

몸은 가만히 있는데 시야가 계속 바뀐다. 언젠간 몸은 그대로고 목 위로만 빙글빙글 도는 기괴한 상황이 벌어질 것이다.

전체 오브젝트는 일정 주기를 갖고 매번 목 관절 오브젝트의 회전값을 체크하고, 전체 오브젝트를 회전하여 목 관절이 가리키는 방향과 일치하도록 교정하는 로직을 갖고 있을 필요가 있다.

 

아직 내가 직접 인간형 오브젝트의 동작을 컨트롤하는 경험을 한 적은 없다. 아마 곧 하게 될 것이다.

위와 같은 개략적인 방법을 적은 이유는 막상 시도했을 때 첫 단추를 빨리 꿰기 위함이다.


요즘 들어 프로그래밍 공부에 의욕이 팍팍 떨어지고 있다. 3달째에 가장 큰 고비를 맞았다.
다음주부터 시작될 실전 프로젝트를 앞두고 이전에 팀 프로젝트를 공동 진행한 적이 있는 수강생이 함께 실전 프로젝트를 진행하지 않겠냐는 제안이 왔다. 사실 별 생각도 없이 눈앞에 있는 팀 프로젝트만 깔짝거리고 있었다. 마다할 이유가 없으니 흔쾌히 수락했다.

 

코딩을 하면서 계속 생각나는 것이 있다. "어떻게 해야 프로그래밍 문제 이해를 정확하게 할까?"
내가 코딩문제를 푸는 모습을 생각해 봤다. 로또에 몇 등 당첨됐는지, 더러워진 장벽의 어느 부분부터 닦아야 가장 빨리 닦는지, 공병을 갖다 주면 콜라를 몇개 얻을 수 있는지.. 굉장히 현실적인 문제를 코드로 접근하라는 요구가 많다.

나는 이런 문제는 그냥 현실세계에 앉아서 파악하려 한다. 로또 번호가 3개 맞았을 때는 몇등일 것이고, 장벽의 2번째 구간부터 4칸씩 닦으면 가장 빠를 것이며, 공병을 30병 들고가면 콜라를 13개 받을 것이다..
이렇게 풀면, 느리다. 허점도 많아지고, 코드도 길어진다. 복잡도가 증가하는 것이다.

 

컴퓨터도 컴파일을 한다. 컴퓨터의 코드를 현실 세계로 끌어오는 과정이다.

나도 컴파일을 해야 한다. 현실 세계의 문제를 컴퓨터적 논리로 생각하는 과정이 필요한 것이다.
애초에 배열의 시작부터 다르다. 0번째 인덱스는 0이라서 0이 아니라, 그 배열의 시작점이라서 0인 것이다.