내일배움캠프 사전캠프 12일차 - 머티리얼&라이팅, 간단한 상호작용 구현 (문 열기 또는 아이템 줍기)

머티리얼이란?

 : 게임 오브젝트의 표면 특성을 결정하는 요소로, 텍스쳐, 색상, 반사, 굴절 등 다양한 시각적 효과를 모아서 3D모델의 표면에 구현된다.

머티리얼의 역할
 - 표면 표현: 금속. 유리 나무, 플라스틱 등 다양한 재질을 사실적으로 표현할 수 있음.
 - 빛의 상호작용: 조명에 따른 반사, 굴절, 그림자 효과를 통해 현실감을 부여.
 - 효과 구현: 노멀 맵, 스페큘러, 메탈릭 등 세밀한 속성을 통해 복잡한 시각효과를 구현.

텍스처란?
 : 머티리얼을 구성하는 정보 중 하나, 여러개의 텍스처를 섞어 하나의 머티리얼로 만든다.

텍스처 맵의 종류
 1) 컬러 정보 (Albedo) = 베이스 컬러

 - 물체의 색상 정보가 저장된 텍스처
 - 조명, 그림자 등의 영향을 받지 않는 상태의 순수한 정보

2) 라이팅 정보 (Normal Map)

 - 미세한 굴곡을 표현하는 텍스처
 - 조명이 닿았을 때, 튀어나온 부분은 밝고, 패인 부분은 어둡게 표현됨.
 - 언리얼에서는 RGB값을 전부 사용하나, 그 외의 일부 포맷의 노멀맵은 B값만 쓰이는 등 여러가지 상황이 있을 수 있다.
  언리얼 예시)
   R값: X축 높낮이
   G값: Y축 높낮이
   B값: Z축 높낮이

3) 패킹 텍스처 (Packed Texture)

 - 성능 최적화를 위해 개별 텍스쳐를 하나로 합쳐놓은 형태
  3-1) ORM 텍스처
   - AO (Ambient Occlusion), Roughness, Metallic 등의 정보가 들어있다.
   - R값(AO), G값(Roughness), B값(Metallic)값이 각각 저장되어있다.

그 외 텍스처
 - Displacement, Bump, Gloss등의 텍스처도 종종 볼 수 있으나, 잘 쓰이지 않는다.
 - Bump, Displacement는 Normal맵과 비슷한 역할을 하나 Normal맵에 밀려 잘 쓰이지 않는다.
 - Gloss텍스처는 Roughness 텍스처와 비슷한 역할을 하나, Roughness는 0이 매끄럽고, Gloss는 1이 매끄러운 상태이다.


랜드스케이프 머티리얼 관련 노드

Landscape Layer Blend
 - 머티리얼에 저장된 각 종류의 레이어를 섞어주는 노드


Landscape Visibility Mask
 - 랜드스케이프 전체 투명도를 관리하는 노드
 - 이를 사용하기 위해서는 해당 머티리얼의 Blend 모드타입이 'Masked'여야 한다.
 - 자세한 내용: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/landscape-visibility-tool-in-unreal-engine


포스트 프로세스 볼륨(Post Process Volume) 액터
 - 라이팅을 후보정해주는 액터

  1) Exposure 노출
   - 빛의 노출 정도를 보정해주는 툴
   - Auto Exposure Histogram: 캐릭터가 있는 위치마다 빛의 양을 계산을 하여 라이팅이 다르게 보임.
   - Manual: 빛의 양을 고정한다.

  2) Lens Flares
   - 빛의 산란을 표현함.

  3) Bloom
   - 빛의 번짐을 표현함. 주로 창문에서 나오는 빛 등을 표현한다.


머티리얼 애니메이션
 - 블루프린트 뿐 아니라 머티리얼만을 활용해서 애니메이션을 만들 수도 있다.
 - 머티리얼 애니메이션을 만들때에는 삼각함수법이나 Time등을 포함한 각종 머티리얼 노드를 활용한다.

 예시) m부터 n까지 수치가 사인곡선대로 움직이는 머티리얼을 만들때는 다음과 같이 배치한다.

Fresnel(프레넬)
 - 화면상에서 법선 벡터와 카메라간의 각도차를 바탕으로 표면 가장자리 부분이 두드러지도록 값을 계산해주는 노드
 - 가장자리가 빛나게 해준다.

1. 개념 바로 알기

Line Trace란?
 - 눈앞에 있는 오브젝트를 탐지하는 “레이저 광선” 같은 기능
 - 마우스나 키보드로 상호작용 대상 탐지 시 사용됨

인터랙션 키 바인딩
 - 키보드 입력을 통해 특정 이벤트 실행
 - 일반적으로 E키나 마우스 클릭에 매핑


2. 직접 구현해보기

목표: 캐릭터가 눈앞의 오브젝트와 상호작용할 수 있도록 구현합니다.

[Step 0] Interact 입력 Mapping 추가
 - Edit → Project Settings → Input
   1) Action Mappings에 Interact(키: E) 추가
   2) E 키 이벤트를 블루프린트에서 찾기 위함.

[Step 1] 문 또는 아이템 블루프린트 생성
 - 새 'Actor' 블루프린트 생성 ('BP_InteractableDoor' 또는 'BP_PickupItem')
 - Static Mesh 추가 (문 / 아이템 등으로 보이게 설정)
 - 생성한 'BP_InteractableDoor'/'BP_PickupItem' 에디터에서
   1) Components 탭의 Static Mesh 선택
   2) Collision Presets → BlockAll 설정
   3) Line Trace가 오브젝트를 정확히 감지합니다.

[Step 2] 상호작용 범위 구현 (Line Trace)
- 'MyCharacter' 블루프린트에 'Line Trace by Channel' 노드 추가
- 'E' 키 입력 → LineTraceByChannel → Hit된 오브젝트 태그 확인 → Custom이벤트 실행

[Step 3] 문 열기 or 아이템 줍기 로직 추가
- 문이면: 'SetRelativeRotation'으로 회전값 변경
- 아이템이면: 'Destroy Actor'로 사라지게 처리

[Step 4] 태그 설정 & 테스트
상호작용 대상 블루프린트에 'Tag: Interactable' 설정
게임에서 캐릭터가 'E 키를 눌러 상호작용 되는지 테스트

3.결과 확인

겨울 숲속의 SF풍 유적지를 묘사하였다. 밑바닥은 전체적으로 안개가 껴 있으며(ExponentialHeightFog), 언덕을 오를수록 안개는 걷히고 이질적인 건물이 한눈에 보이는데, 그 중 하나는 빛이 강렬하게 점멸하고 있다.

기존의 랜드스케이프에 Snow, Grass, Asphalt 등 머티리얼을 섞어서 바닥을 칠했다. 또한 기존 특정건물의 Emissive값에 Time을 포함한 사인함수를 추가시켜 주기적으로 빛나게끔 설정하였다.

아이템과 상호작용 시에는 캐릭터 위치에서 카메라 앞방향으로 LineTrace를 실시하는데 아이템과 접촉하면 아이템이 사라지지만 벽 등 다른 물체가 먼저 접촉되면 상호작용을 하지 않는다.

LineTraceByChannel노드를 사용할 때 아이템임을 확인하기 위해 아이템 블루프린트의 '클래스 디폴트'에서 'Interactable'이라는 태그값을 부여하고, Hit된 액터의 태그값을 체크하는 'Actor Has Tag'를 사용하여 아이템을 판별하였다.

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁