본문 바로가기
개발일지/The Outcast House

[The Outcast House] 2. 플레이어와 아이템 구현

by heydotory 2025. 2. 26.

이번에는 플레이어 캐릭터 기능 구현과 아이템 상호작용을 만들었다.

플레이어

먼저 플레이어 기능 구현이다.

필요한 요구사항은 다음과 같다.

  • 앞을 밝힐 손전등
  • 1인칭 카메라
  • 움직일 때 카메라 흔들림 (Head bob)
  • 아이템을 넣을 인벤토리

앞을 밝힐 손전등

공포게임이면 손전등이 필요하다.

이 게임에서는 스마트폰 불빛을 사용하기로 했다.

카메라 앞에 스마트폰을 달고 그 밑에 라이트를 달아서 손전등을 만들었다.

 

스마트폰에 스프링암 컴포넌트를 달고 Rotation Lag를 체크하여 라이트가 뒤늦게 따라오는 효과를 구현했다.

 

1인칭 카메라

해당 플레이어 캐릭터는 언리얼 1인칭 템플릿에 등장하는 기본 플레이어 캐릭터라 크게 손 볼 부분은 없었다.

다만 개발 영상 촬영을 위해 부드러운 카메라 움직임이 필요하다는 생각이 들었다.
게임패드를 사용하면 어느 정도 부드러운 움직임이 가능하지만 개발 도중에 패드를 연결하고 들고 촬영하는 것이 번거롭다고 생각했다.
그래서 1인칭 카메라에 스프링암을 달고 디버깅 키를 통해 Rotation Lag On/Off 할 수 있도록 하였다. 덕분에 부드러운 카메라 움직임을 얻었다.

 

움직일 때 카메라 흔들림 (Head bob)

걷거나 뛸 때 카메라가 흔들리도록 하였다.
카메라가 흔들리는 패턴을 정의하기 위해 CameraShakeBase 클래스를 사용했고 Root Shake Pattern Perlin Noise 패턴을 사용했다.

카메라 흔들림을 실행하기 위해 움직임 Input을 입력받고 있을 때 실행이 되는 InputAction Triggered 부분에 Client Start Camera Shake 노드를 추가했다.

Bool 변수와 Select 노드를 사용해서 걸을 때와 달릴 때 다른 클래스를 사용하도록 했다.

가만히 있을 때는 Triggered가 동작하지 않아 카메라가 흔들리지 않는다.

 

아이템을 넣을 인벤토리

인벤토리 구현이다. 처음에는 바이오하자드와 같은 슬롯 형식의 인벤토리를 생각했다.

출처: GameUIDataBase - Resident Evil 7

 

인벤토리를 열면 배낭을 앞으로 메고, 위에 슬롯이 뜨는 형태를 생각했다.

그런데 구현이 생각보다 복잡했다. 그래서 배낭에 획득한 아이템을 달아놓으면 어떨까 생각을 해봤다.
이 시점에서는 아이템 상호작용이 구현된 상태였기 때문에 손에 든 아이템을 배낭에 부착하면 다시 꺼내는 기능을 만들기 위해 추가적인 작업이 필요하지 않았다. 이렇게 하니까 구현 난이도가 확 낮아졌다.

나는 UI를 게임 속 오브젝트로 대체하는 것을 선호해서 이 방법이 나와 맞는다고 느꼈다.

또한 아이템 종류가 적을 것이라 예상하여 앞으로 큰 문제는 없을 거라 생각했다.

아이템

다음으로 아이템 구현 내용이다. 아이템의 요구사항은 다음과 같다.

  • 각 아이템마다 이름과 모델링, 상호작용 가능 여부와 손에 들 수 있는지 여부 등이 달라야 함,
    그리고 이것을 쉽게 설정 가능해야 함
  • 아이템을 바라보면 외곽선과 아이템 이름이 표시됨
  • 상호작용 키를 누르면 기능이 작동 또는 손에 들게 됨

각 아이템 특징을 쉽게 설정

이건 상속에 관한 내용이다.

Item 클래스를 만들고 공통적으로 필요한 내용은 여기에 넣고 세부사항은 Child를 만들어 관리하도록 하였다.

상호작용이 필요한 오브젝트는 모두 아이템의 Child가 되게 하였다.
이렇게 하다 보니까 Child가 여러 개 필요한 경우도 생겼다.

) 아이템 – 현관문, 입구 문, 방 문


Child
에서 상호작용시 호출되는 함수 UseItem을 오버라이드 해서 아이템에 따라 다른 동작을 하도록 하였다.

Door 클래스에서 함수 오버라이드를 통해 문을 여닫도록 만들었다.

각 아이템은 다음과 같은 형태가 되었다.
이렇게 하나하나 뽑아내니까 최적화하는 재미가 있었다.

 

Item
변수: 이름, 타입, 집을 수 있는지, 잠겼는지 등
함수: 아이템 사용, 외곽선 표시 등

Door
  
변수: 열려 있는지
  
함수: 열기, 닫기

   Front Door
       
문 모델링 적용

 

아이템 외곽선과 이름 표시

외곽선은 포스트 프로세스 재질을 사용하여 구현했다.

Custom Depth을 통해 외곽선을 계산하는데 바라보는 아이템만 Custom Depth을 켜줌으로써 외곽선을 껐다 켰다 하게 했다.

A, B는 Custom Depth로 렌더링 된 이미지고 이를 상하좌우로 이동시킨 뒤 서로 빼면 외곽선이 보이게 된다.

Thickness는 상하좌우 이동하는 거리를 조절하여 외곽선의 두께를 조절하는 것을 보여준다.

LineTrace를 통해 범위 내에 아이템이 있으면 외곽선을 켜고 아이템 이름을 가져와 UI에 표시되게 했다.

상호작용

LineTrace를 통해 아이템인지 확인하고 상호작용 버튼을 누르면 작동하거나 손에 들도록 하였다.

아이템 사용
아이템 획득


손에 드는 아이템의 경우 아이템마다 카메라에 보이는 형태가 달라야 하기 때문에 Grab Offset Rotation을 주었다.