Unreal Engine/게임클래스 - 언리얼엔진 기초

[12강] Line Trace와 Material

whereareyoung 2023. 8. 16. 17:24

Line Trace 실습

1. 저번에 제작해두었던 Actor Class 블루프린트인 "BP_05_LineTrace" 로 들어간다  

 

2. 기존에 제작해두었던 "Draw Line"을 Delet 하고, 라인을 추적하기 위한 "LineTraceForObjects" 함수를 만들어 준다. 

제거해야할 기존의 DrawLine

 

3. 라인을 추적할 시점이 기존 것과 같기 때문에 이전에 만들어둔 자료에 들어가서 위치 값을 복사해온다. 

 

4. Tick 이벤트 함수를 다음과 같이 연결한다. 

1) 0번은 시작 위치에 연결

2) 1번은 끝나는 위치에 연결 

 

5. 자료형 연결 

추적할 오브젝트타입이 Pawn (Character) 이기 때문에 Object Types 를 끌어서

다음과 같이 배열 자료형에 대한 자료형을 불러온 후, Pawn 으로 설정해준다. 

오브젝트 타입을 더 확실하게 확인하기 위해서 저번에 만들어 뒀던 "BP_Player"의 콜리전 프리셋이 "Pawn" 인지 한번 더 확인하는 습관이 중요하다 

 

6. 충돌처리 무시 설정 

캐릭터를 추적할 때 동그란 것들은 충돌 되지 않도록 다음과 같이 "Actor to Ignore" 설정을 해 준다. 

 

7. 디버깅

디버깅 용으로 라인이 그려지는 건데, 라인이 매 프래임마다 그려지니 다음과 같이 설정해준다. 

Draw Debug Type의 다른 옵션들을 살펴보자면, 

For One Frame : 매 프레임마다 그리기 

For Duration : 일정 시간마다 그리기  

Presistent : 계속 유지 하기 

 

8. Line 출력 색 바꾸기 

역할 구분을 위해 Line출력 색을 다음과 같이 바꾸어 준다. 

Trace Color : 처음 나타나는 색 

Trace Hit Color : 충돌 후 변경되는 색 

 * 현재 설정에서, 매 프레임마다 라인을 그려주게 되어 있으므로 Draw Time (시간)은 설정에 의미가 없음 

 

실습 

1. 컴파일 후 플레이를 해보면 두 공 사이에 녹색 선이 생긴다. 

2. 캐릭터가 이동 후 충돌을 하면 선이 Pawn의 Capsule Collider를 감지 해 붉은 색으로 바뀌는 것을 확인할 수 있다. 

(BP_Player 의 Capsule Collider - Hidden in game 을 활성화 / 비활성화 하며 확인해 볼 수 있다.)

3. 반면, 다른 물체(큐브 등)을 가져다 두면 충돌처리가 되지 않는다.

   - Line Trace 는 가장 가깝게 충돌된 것을 감지한다. 

   - 캐릭터에 충돌이 되는 것이 아닌 충돌체에 충돌되어 검출한다. 

 

캐릭터 충돌 후 머터리얼 색상 변경 실습  

1. Line Trace 에 "Branch" 를 생성하고 다음과 같이 연결 

- "Out Hit" 을 구조체 핀분할 할 경우 너무 많이 나와서 "Break Hit Result" 로 충돌한 엑터인 "Hit Actor" 를 가져온다. 

- "Return Value" 의 경우 충돌하면 True 충돌을 하지 않으면 False가 나오게 된다. 

- "BP_Player 에 형변환" True 일 경우 Valid, False일 경우 "BP_Player" 가 Null이기 때문에 Not valid로 간다. 

 

머터리얼

다음과 같이 노드로 나오는 구조가 원본 

- 머터리얼을 실행시키기 위해서는 GPU에 맞는 언어로 자동 번역을 수행, 동작 시키게 됨 (쿠다나, 다이렉트 x 등)

- 원본을 사용하게 되면 이 값을 결과물로 출력하기 위한 컴파일이 계속 일어나게 됨, 매번 플레이 마다 이러한 과정이 진행되게 되면 시간이 오래 걸리기 때문에 머터리얼 인스턴스를 만들어서 사용하는 것이 보편적 

- 머터리얼 인스턴스는 컴파일이 완료된 객체(머터리얼)을 가져와서 사용 (에디터 상에서만 값 변경이 가능함, 프로그래밍 상으로는 변경이 불가능)

* 프로그래밍으로 편집이 가능한 것은 Material Instance Dynamic - 에디터에서 생성이 불가능하고, 프로그래밍 코드에서만 생성이 가능 

 

2. 기존 머터리얼 Instance 제작 후 "VectorParameter", "Scalar(Float 한개 일 때 사용하는 것)" 출력 후 다음과 같이 세팅  

(기존의 것은 값이 변하지 않는 상수 형태이기 때문에, 용도에 맞게 다음과 같이 변수 형태로 제작)

 

3. 저장 후 머터리얼 인스턴스로 제작 

* 원본 노드 파일에서 값을 변경할 때에는 딜레이가 있지만, 인스턴스에서는 딜레이가 없는 것을 확인 할 수 있다. 

 

4. BP_Line Trace 블루프린트로 돌아와서 "Material Instance Dynamic" 제작 

위의 자료를 참고하여 "Get Dynamic Material" 함수 생성 

* 주의 : 함수는 되돌려주는 값이 있고, Custom Event 는 되돌려주는 값이 없다. 

 

5. 전에 만들어 두었던 노드 편집 

Line 을 Set 한 부분을 끊어주고 위로 올려주기 

 

6. 플레이어 Material 가져오기

인지하고 있어야 하는것들

- 지금 적용하고 싶은 캐릭터의 Auto Possess Number 은 0이다.

- BP_Player로 쓰려면 그 형으로 변경해야 하며, Player의 mesh안에 Material 이 들어있기 때문에 Get Mesh 를 먼저 해야한다. 

 

Element Index : Mesh 가 가지고 있는 Material 들의 Index 

 

7. BP_Player 의 Material 인스턴스로 만들기 

다음과 같은 경로를 통해 Materials 을 더블클릭하면 Material의 노드로 들어가게 되는데, 얘네의 정보를 확인하고 인스턴스로 만들어서 Materials 폴더에 옮겨준다. 

(머터리얼 원본들)

(원본은 그대로 두고, 인스턴스로 만들어서 이동한 상태)

 

다시 BP_Player로 돌아가서 기존 원본 머터리얼을 인스턴스들로 변경하여 준다. 

 

8. Line Trace 블루프린트로 돌아가서 "Create Dynamic Material Instance" (2번째 것)를 생성하고 다음과 같이 연결 

- Material : 순수한 머터리얼 상태 

- Material Instance : 인스턴스화된 머터리얼 (에디터에서 값 수정가능)

- Material Instance Dynamic : 프로그램을 통해 생성하며, 프로그램을 통해 값 수정 가능 

위 과정을 통해 캐릭터 메쉬에서 가져온 머터리얼을 다이나믹 인스턴스 머터리얼로 출력될 수 있도록 변경하게 되었음 

 

9. Material Instance Dynamic 타입의 "BodyMaterial" 변수 생성 

 

10. 생성한 변수를 Set 하여 다음과 같이 연결

 

11. 이제 밑으로 내려가서 만들어둔 변수를 가져와 Get "Body Material", "Set Vector Parameter Value"

플레이어가 충돌되었다면 색이 바뀔수 있도록 설정해주어야 함. 

Parameter Name 에 BP_Player Material에 들어있는 변수이름인 "BodyColor" 넣어준 후, 색 변경

 

12. 이렇게 만들어진 결과를 플레이어에게 할당해 준다. 

1) Get Player Character - Get Mesh - Set Material

2) 지금까지 만들었던 머터리얼을 불러오고 Get Material 해서 할당해준다. 

 

이렇게 될 경우 1. 라인 충돌이 되고, 2. 플레이어로 형변환이 가능하다면 (플레이어라면) 

Body Material이 빨간색으로 바뀌게 된다. 

 

정리하자면 

1. Line Trace for Object : 오브젝트 타입을 지정하여 검출하는 방법으로 선으로 추적하는 방식

2. Object types : 추적할 오브젝트 타입을 배열로 넣는것  

3. Actors to Ignore : 무시할 액터 설정 

4. Ignore Self : 자기도 무시할지 말지 결정 

5. 머터리얼 기본지식 (Material의 세 종류)

   1) 원본 : 변경불가, GPU값 게산 문제 때문에 인스턴스로 불러와서 사용해야함

   2) 인스턴스 : 에디터에서만 편집가능

   3) 프래그래밍용

 

다음 강의를 통해서는 이번 작업물이 가지고 있는 문제점을 해결하고 (로고까지 색 변환)

(현재는 바디 머터리얼만 바뀌고 로고머터리얼은 바뀌지 않음, 머터리얼 인덱스 1번에만 할당했기 때문에)

컬러가 랜덤하게 바뀌는 것을 시도해 볼것이고 

또한 일정 구역을 검출해낸 후 간단한 물리효과를 적용하는 방법 다루도록 할 예정이다 

 

 

오늘 학교에 오는길에 7th vertebrae(7번 척추)가 잘 보이는 사람을 만났다. 

그림그릴때 중요한 대표적인 Body Landmarks 중에 하나인데 이러한 우연한 발견이 사람과 예술에 대한 애정을 다시 샘솟게 한다. 내가 그동안 익혔던것, 보냈던 시간... 

그저 돈을 벌고 일을 하기 위해서 행했던 것이 아니라 사랑으로 시작되었던 것들인데

좋은 작품을 만들겠다는 어릴적 다짐을 잊지 않기를 진심으로 바란다.

 

꼼꼼히 정리하느라 두시간 정도 걸렸던 것 같은데 굉장히 흥미로웠고 이번 강의도 알찼다.

오늘도 많이 배웠고 진심으로 감사한 마음을 전한다.  

 

'Unreal Engine > 게임클래스 - 언리얼엔진 기초' 카테고리의 다른 글

[14강] Multi Sphere Trace  (0) 2023.08.17
[13강] Asset Migration  (0) 2023.08.17
[11강] 객체 찾기와 반복문  (0) 2023.07.25
[10강] Collision (Overlap / Hit)  (0) 2023.07.24
[9강] Collision  (0) 2023.07.19