[Charon] #Final. 간단한 보스몹 만들기 + 카메라 셰이킹(with 시네머신)

2023. 4. 5. 14:53Projects/Charon

 
 
 

 

어찌보면 여기까지가 이 프로젝트의 마지막 구현일 수 있겠네요. 오늘은 간단하게 만든 보스몹에 대해 얘기해보겠습니다. 보스몹은 게임에서 플레이어에게 위압감과 함께, 목표를 심어주는 역할을 합니다. 하지만, 제가 만든 보스몹은 그에 반해 너무 초라하네요...ㅎㅎ😂 시간 관계상 간단한 2가지 패턴만 적용시키기로 했었습니다.

 

 

 


1. 보스몹 "진광"

 

보스몹 "진광"의 패턴은 플레이어와의 거리에 따라 두 가지밖에 없습니다.

 

  • 플레이어와의 거리가 멀 경우, 회전베기 동작을 두 번하며 플레이어에게 접근합니다.
  • 플레이어와의 거리가 가까울 경우, 거대한 검을 소환하며 땅을 내려찍습니다.

 

 

일반 적 몬스터와 다르게, 다음 특별 사항 또한 존재합니다.

 

  • 넉백 효과 타격 애니메이션이 적용되지 않습니다.
  • 공격을 시전 중일 때에는 무적 판정이 적용됩니다.

 

 

일반 몹 만드는 것과 크게 다르지 않습니다. 상태 기계(State Machine)을 재활용하여 패턴 2가지를 구현해주고, Animator Override Controller를 사용하여 비슷한 애니메이션 메카님 체제를 갖추었던 일반 몹들과 달리 별도로 만들어주었습니다. 필요한 사운드, 이펙트, 상태들을 추가하여 초기화해주었습니다.

 

보스몹 진광 초기화

 

마찬가지로 애니메이션 이벤트 함수를 통해, 싱크와 함수 호출 시점을 맞추었고, 코루틴(Coroutine)을 이용하여 쿨타임 타이머를 재는 방식을 선택하였습니다.

 

타이머 설정 코루틴

 

진광이 들고 있는 무기에서 스킬 구현부를 작성하고, 상태 기계를 활용하여 스킬 시전하는 시점을 선택하게 됩니다.

플레이어와의 거리에 따라 어떤 스킬을 사용할 것인지 결정하게 되는 것이죠. 다 만들고 난 모습을 보면 다음과 같습니다.

 

회전 베기 패턴
거대한 검 내려찍기 패턴

 

기존 방식을 확장하면 쉽게 패턴을 만들 수 있습니다. 하지만, 타격감이 너무나도 없어보입니다.

타격감이 생명인 게임인만큼, 사운드카메라 셰이킹이 필수로 적용되어야 할 것 같네요.

 

 

 


2. 카메라 셰이킹(Camera Shaking)

 

유저에게 생동감과 몰입감을 줄 수 있는 방법 중 하나로, 카메라 셰이킹(Camera Shaking)이 있습니다. 특히 1인칭 시점 게임에서 많이 활용되죠. 걷거나 달리거나, 넘어지거나, 지진이 나서 땅이 흔들릴 때 카메라도 같이 흔들리면서 실제로 그 현장에 있는 듯한 느낌을 줄 수 있습니다. 사운드까지 적절하게 들어간다면 금상첨화죠.

 

Unity 엔진에서는 카메라와 관련된 기능들을 쉽게 작업할 수 있도록, 시네머신(Cinemachine)이란 걸 제공합니다.

 

 

시네머신을 사용하기 위해서는 메인 카메라 외에도 가상 카메라(Virtual Camera)가 추가로 더 필요합니다.

메인 카메라에는 CinemachineBrain 컴포넌트를, 가상 카메라는 빈 오브젝트를 만들어, CinemachineVirtualCamera 컴포넌트를 넣어줍니다.

 

그리고 이 때까지 GIF들을 보면, 카메라가 플레이어(손돌)를 따라다니는 것을 볼 수 있는데 이것 역시 시네머신에서 적용할 수 있는 기능입니다. 가상 카메라CinemachineFollowZoom 컴포넌트를 추가로 부착해주면 됩니다.

 

가상 카메라에 붙어있는 컴포넌트

 

CinemachineVirtualCamera 컴포넌트에서 FollowLook At플레이어의 몸통(Body)으로 설정해주고, BodyTransposer로, AimComposer로 설정해주면 됩니다.

CinemachineFollowZoom 컴포넌트에서는 카메라의 시야각, 폭 등을 설정해주면 됩니다.

 

시네머신 가상 카메라가 잘 따라다니는 모습

 

그런데 우리의 목적은 카메라 셰이킹이므로 이 기능을 추가해봅시다. 가상 카메라CinemachineImpulseListener 컴포넌트를 부착해줍니다.

 

 

진동을 감지할 채널을 설정하고, 거기에 따른 진동 유형과 강도, 몇 번 흔들릴 것인지, 얼마동안 흔들릴 것인지에 대한 값들을 설정해주면 됩니다. 이렇게 되면, 진동의 근원(Source)으로부터 오는 신호를 해당 가상 카메라의 리스너가 받아, 셰이킹 처리를 해주는 것입니다.

 

리스너는 등록했으니, 진동을 일으키는 근원(Source)을 설정해줘야 합니다. 플레이어(손돌) 오브젝트CinemachineCollisionImpusleSource 컴포넌트를 부착해줬습니다.

 

 

이렇게 되면, 플레이어(손돌)이 외부 오브젝트로부터 부딪혀 충격을 받게 되었을 때, 진동이 일어나게 됩니다.

하지만, 모든 오브젝트마다 다 진동이 일어나게 되면 게임하는 내내 카메라가 흔들릴 것입니다.

 

저는 적 몬스터의 무기만 닿았을 때, 진동이 발생하도록 설정했습니다. 이렇게 되면, 플레이어가 적을 때렸을 때, 혹은 맞았을 때에만 진동이 일어나게 되겠지요.

그리고, 내 공격 혹은 적의 공격 유형마다 진동 세기 및 진동수, 지속시간을 다르게 설정해주었습니다. 작은 규모의 공격은 적게 흔들리고, 큰 스킬에는 크게 흔들려야 더욱 맛이 살아날 테니까요.

 

카메라 셰이킹 적용 전
카메라 셰이킹 적용 후

 

 

여기에 이제 어울리는 사운드까지 추가된다면 완성입니다. 사운드는 GIF에 녹음되지 않으니, 영상으로 첨부할게요.

카메라 셰이킹 + 사운드 추가

 

저 타격음 찾는데 정말 힘들었습니다... 맘에 쏙 들어서 바로 가져왔어요!

 

 

 


3. 마무리

 

처음으로 도전해 본 3D 게임이었고, 물리와 관련하여 굉장히 힘든 내용들이 많았습니다. 그래도, 힘들었던 만큼 굉장히 좋은 경험과 많은 지식을 얻을 수 있었습니다. 컨텐츠적인 부분이 너무 없어 아쉽지만, 이 정도에서 끝내야 할 것 같습니다.

 

완성도 높은 게임을 만드는 데에는 많은 사람들이 필요하다는 것을 깨달았는데, 팀이 폭파되어 더 이상 작업할 수 있는 상황이 안 되네요. 다음에는 좀 더 준비를 철저히 해서 이번엔 언리얼 엔진으로 한 번 게임을 만들어 보고 싶습니다!

서버쪽도 한 번 만져봐서 멀티플레이 게임도 만들어 보고 싶네요! 긴 글 읽어주셔서 감사합니다.

 

 

 

🔗카론(Charon) Github

728x90
반응형