Unreal Engine/GCC Class (5.5.4)

Unreal Engine 5 배워보기 - 4일차

보별 2025. 3. 20. 13:55
반응형

컴퓨터 및 게임 관련 전공인이 아닌 문외한 일반인이 언리얼 엔진을 배우면서 정리한 내용입니다.
그날그날 배웠던 내용을 제가 나중에 보기 위해 정리한 것으로, 지금 당장 보기에 부족한 점이 아주아주 많고 추후에 수정이 될 수도 있습니다.
오탈자 및 잘못 기재된 내용 지적, 부족한 내용 설명은 언제든지 환영입니다.

 

본글은 언리얼 엔진 5.5.4 버전 영문판을 기준으로 합니다.

----------------------------------------------------------------------------------------------------------------

 

4일차 학습 내용

- Light

   Directional Light

   Sky Light

   Point Light

   Spot Light

   Rect Light

   Emissive Color

   Blink 효과 주기

- HDRI

- 액터 생성 및 제거 이벤트 생성

  액터 생성

  생성된 액터 제거

  생성된 액터 크기 변화

 

 

*shift를 누른 채로 액터의 백터를 드래그하면 해당 액터와 맵을 같이 움직일 수 있음

*Content Drawyer에서 이미 레벨에 배치했거나 BP 설정해둔 파일을 기존과 다른 경로로 이동한다고 해서 기존에 배치됐던 오브젝트들에 오류가 나지는 않음

 

Light

"02_Light" 폴더를 새로 생성하고, "Lv_Light" 라는 이름의 새로운 "Basic" 형식의 레벨을 생성한다.

그리고 3일차 제작했던 판넬 모양의 액터 여러개를 ground에 복사, 붙여넣기를 한다.

3일차에서 제작했던 판넬 모양 액터

Directional Light

"Directional Light" 는 "직접광" 이라고도 하며, 단순하게 설명하자면 직선으로 나아가는 빛이다.

일종의 태양같은 광원으로 넓은 맵을 전체적으로 비출 때 사용하기 좋은 라이트이다.

"Directional Light" 의 위치, 스케일 값은 다른 액터나 환경에 영향을 주지 않고, 회전값만 영향을 준다.

회전하여 각도가 변하면 위 그림처럼 레벨에 생성된 그림자의 방향이 변한다.

프로젝트 생성 시 Open World나 Basic 모드로 생성하면 맵에 기본적으로 생성되어 있고, 그 외 필요로 할 때에는 "Place Actors" 탭의 "Light" 에서 "Directional Light" 를 꺼내 배치할 수 있다.

오른쪽 "details" 탭에서 "Directional Light" 관련 옵션을 다양하게 손볼 수 있다.

"Source Angle" 의 수치를 키우면 위 사진처럼 태양의 크기가 커지고, 빛이 세지기에 그림자의 경계가 조금 흐려진다.

"Use Temperature" 체크 후, "Temperature" 수치를 낮추면 적색 혹은 황색의 따뜻한 느낌을 주는 빛으로 변하고, 높이면 청색의 차가운 느낌을 주는 빛으로 변한다.

"Affects World" 는 레벨 전체에 영향 끼칠 지의 여부 설정할 수 있다.

"Cast Shadows" 는 해당 광원으로 생기는 그림자의 유무를 설정할 수 있다.

"Atmosphere Sunlight" 는 체크할 경우 광원이 구름에 영향을 받게 되어, 광원이 구름을 지나가게 되면 빛의 세기가 조금 약해진다.

Sky Light

"Sky Light" 는 "간접광" 이라고도 하며, 말 그대로 직접적인 빛이 아는 간접적인 빛이다.

"Sky Light" 는 위치, 회전, 스케일 값 모두 다른 액터나 환경에 영향을 주지 않는다.

게임 개발자의 경우 "Sky Light" 에 대해 크게 알아야할 할 건 없고, "Intensity Scale" 을 통해 "Sky Light" 의 세기만 조절을 할 수 있다는 점만 기억하고 있으면 되겠다.

"Intensity Scale" 의 값이 커지면 빛이 세져서 그림자의 조금 옅어지게 된다.

*오브젝트를 우클릭한 뒤 "Snap Object to View" 를 누르면 해당 오브젝트를 현재 시점의 위치로 가져올 수 있음

Point Light

"Point Light" 는 광원의 한 점에서 모든 방향으로 빛이 나아가는 라이트이다.

"Point Light" 는 위치 값만 다른 액터나 환경에 영향을 준다.

오른쪽 "details" 탭의 "Intensity Unit" 은 광원의 종류를 변경할 수 있는 기능인데, 게임 개발자들은 손댈 일이 거의 없는 기능이다.

"Attenuation Radius" 는 조명의 반경을 조절할 수 있는 기능이고, "Source Radius" 는 광원의 반경을 조절할 수 있는 기능이다.

"Use Temperature" 는 "Directional Light" 와 마찬가지로 체크 후에 수치 조절의 통해 빛의 느낌을 변화시킬 수가 있다.

"Affects World" 와 "Cast Shadows" 도 마찬가지로 각각 레벨 전체에 영향 끼칠 지의 여부와 해당 광원으로 생기는 그림자의 유무를 설정할 수 있다.

오른쪽 "details" 탭의 "Advanced" 에서 "Use Inverse Squared Falloff" 의 체크를 해제하고, "Light Falloff Exponent" 의 수치를 0에 가깝게 낮춰주면 위 사진처럼 빛과 그림자의 경계가 명확해진다.

Plane 액터를 생성하고 빛 반사가 가능한 금속 재질의 material을 적용시켜준 뒤에, 해당 Plane 액터 위에 "Point Light"를 배치한다.

"Source Radius" 는 위에 적혀있듯이 광원의 반경을 조절할 수 있는 기능인데 언뜻 보기엔 차이가 없어보인다.

하지만 위 사진처럼 아래에 빛 반사가 되는 material의 액터를 놓고 보게 되면 그 차이가 명확히 보이게 된다.

"Soft Source Radius" 수치를 높일 수록 반사되는 광원을 부드럽게 보이게 만들어주고, "Source Length" 는 위 그림처럼 광원 길이를 조절할 수 있다.

Spot Light

"Spot Light" 는 한 점에서 지정한 일부 방향으로만 빛이 나아가는 라이트이다.

일부 방향으로만 나아가기에 위치와 방향 모두 다른 액터나 환경에 영향을 준다.

오른쪽 "details" 탭의 "Inner Cone Angle" 은 빛의 범위 중 빛이 유난히 강렬한 범위를 조절할 때 쓰이고, "Outer Cone Angle" 은 전체적으로 비추는 빛의 범위를 조절할 때 쓰인다.

"Spot Light" 또한 "Use Inverse Squared Falloff" 의 체크를 해제하고, "Light Falloff Exponent" 의 수치를 0에 가깝게 낮춰주면 위 사진처럼 빛과 그림자의 경계가 명확해진다.

https://ieslibrary.com/browse

위 사이트에서 ies 관련 파일을 다운 받을 수 있는데, ies는 조명에서 나오는 빛의 패턴을 가리킨다.

ies 조명 소스를 다운받고 "Content Drawer" 로 가져오면 material처럼 "Spot Light" 에 적용이 가능하다.

Rect Light

"Rect Light" 는 
사각형 모양의 광원에서 빛이 나오는 라이트이다.

모니터나 형광등 같은 광원에서 나오는 빛을 표현하고 싶을 때 주로 쓰인다. 

Barn Door 수치를 조절하면 위와 같이 노란색 사다리꼴 모양이 나옴

"Barn Door Angle" 및 "Barn Door Length" 의 수치를 조정해서 위 그림처럼 형광등 같은 형태로 나오는 광원이 제작 가능하다.

다만 "Rect Light"컴퓨터 소스를 많이 잡아먹기에 최적화를 위해 많이 배치하지 않는 편이 좋다.

Emissive Color

레벨에 아무 shape의 액터를 하나 생성하고, "Content Drawer" 에 material도 하나 생성한다.

그리고 위에서 생성한 액터에 생성한 material을 적용시켜준다.

material 더블 클릭하여 BP창을 열고, '3' 을 누른 채로 좌클릭을 해서 해당 material색상을 부여해준다.

노란색으로 만들면 다른 색들보다 광원의 색 변화 체감이 잘 되기에 노란색 계열로 부여해주는 것이 좋다.

색상을 변경해준 뒤 색상 핀을 "Emissive Color" 핀과 연결하게 되면 위 사진처럼 부여된 색의 빛을 발하는 액터가 생성된다.

'1' 과 'm' 을 각각 누른 채로 좌클릭을 하면 위 사진과 같은 노드가 2개 나오는데, 해당 노드들을 위 사진처럼 연결해준다.

그리고 'Value' 값을 10으로 해준다.

이렇게 하면 위에서 만든 광원 액터의 밝기가 보다 더 밝아지는 것을 확인할 수 있다.

이 기능은 네온사인 효과를 줄 때 사용하게 된다.

Blink 효과 주기

"Content Drawer" 에서 새로운 BP 클래스를 생성한다.

생성한 BP를 더블 클릭하여 BP 창을 열어준 뒤, "Event Graph" 탭으로 가 "Event Begin Play" 노드만 남겨두고 나머지 노드는 지워준다.

변수를 하나 생성해야하는데, 이름은 'EmmissiveLight' 로 하고 자료형은 'Static Mesh Actor' 검색 후 나오는 'Object Reference' 로 해서 생성한다.

해당 변수의 get 노드를 생성하고, 변수의 눈 모양을 켜준다.

"Set Actor Hidden In Game" 노드 생성한 후에 "Event Begin Play" 노드와 연결하고, 'Target' 에 "EmmissiveLight" 변수를 연결한 뒤 'New Hidden' 은 체크한다.

해당 명령은 연결된 액터를 숨기는 명령이다.

그리고 "Delay" 노드를 생성하고 "Set Actor Hidden In Game" 노드와 "EmmissiveLight" 변수를 복사한 뒤, 모든 노드를 위 사진처럼 나란히 연결한다.

뒤쪽의 "Set Actor Hidden In Game" 노드 'New Hidden' 의 체크는 해제한다.

다시 등장시켜야 하기에 숨기면 안되기 때문이다.

"Delay" 의 "Duration" 수치는 일단 1로 입력한다.

"Delay" 에 입력된 시간 이후에 해당 노드와 연결된 액터가 생성된다.

위 BP를 해석하자면 '게임 시작 시 아무것도 없다가 1초 후에 액터를 생성한다.' 는 의미이다. 

위의 노드를 여러번 반복함으로써 깜빡거리게 할 수 있으나, 그렇게 하면 노드가 너무 길어지기에 다른 방법으로 한다.

"Set Timer By Event" 노드를 생성하고 'Event' 핀을 끌어와서 "Add Custom Event" 노드를 생성하고 이름을 'Blink' 라고 지은다.

위에서 만든 첫 "Set Actor Hidden In Game" 노드와 "EmmissiveLight" 노드를 복사해서 가져오고, 복사한 노드와 커스텀 이벤트를 연결한 뒤에 "Set Actor Hidden In Game" 노드의 'New Hidden' 핀을 드래그 해서 "Random Bool" 노드를 생성한다.

"Random Bool" 에서 'Bool' 은 boolean 변수를 의미한다.

이렇게 하면 True, False 값을 반복해서 주기에 주기적으로 등장하고 소멸하는 액터를 생성해서 반짝거리는 효과를 낼 수 있다.

위의 "Set Timer By Event" 노드 뒤쪽에 "Delay" 노드, "Clear And Invalidate Timer By Handle" 노드, "Set Actor Hidden In Game" 노드를 생성하고 위 그림처럼 연결한다.

뒤쪽의 "Set Actor Hidden In Game" 노드 'New Hidden' 의 체크는 해제하는 것을 잊지 않도록 하고,  "Delay" 의 "Duration" 수치는 3으로 입력한다.

여기서 "Clear And Invalidate Timer By Handle"  노드는 타이머를 중지시키는 노드이다.

위 BP를 해석하자면 '게임 시작 시 빛을 내는 액터가 등장하고 사라지고를 반복하며 점멸하다가 3초 후에 완전한 상태의 빛나는 액터를 생성한다.' 는 의미이다.

이번에 생성하는 변수는 자료형에서 'Spotlight' 검색 후 나오는 'Object Reference' 로 해서 생성하고, 이름은 "SpotLight_1" 로 한다.

그리고 변수의 눈 모양을 켜주고, 해당 변수의 get 노드를 생성한다.

해당 get 노드에서 핀을 드래그하여 "Set Intensity (Spotlight Component)" 노드를 생성하고, 'New Intensity' 핀에서 드래그 하여 "Random Float in Range" 노드를 생성한 뒤에, Min 값은 0, Max 값은 100으로 설정한다.

이 노드는 빛의 강도 0~100를 임의 수치로 왔다갔다한다는 의미인데, 이는 즉 Spotlight가 임의의 밝기로 반짝거린다는 뜻이다.

마지막으로 레벨에 존재하는 Spotlight"Spotlight_1" 변수를 연결해주면 Spotlight가 깜빡거리다 3초 뒤 계속 켜지게 된다.

이번에 생성하는 변수는 자료형에서 'Rectlight' 검색 후 나오는 'Object Reference' 로 해서 생성하고, 이름은 "RectLight_1" 로 한다.

그리고 변수의 눈 모양을 켜주고, 해당 변수의 get 노드를 생성한다.

해당 get 노드에서 핀을 드래그하여 "Set Light Color (Rectlight Component)" 노드를 생성하고, 빈공간 우클릭을 통해 "Random Float" 노드 3개를 생성한다.

"Random Float" 노드는 무작위 실수 수치를 생성하는 노드이다.

각각의 노드를 "Set Light Color" 노드의 rgb 값에 연결해주면 끝이다.

'New Intensity' 핀에서 드래그 하여 "Random Float in Range" 노드를 생성한 뒤에, Min 값은 0, Max 값은 100으로 설정한다.

u t 누르고 좌클릭

 

 

HDRI

맨위쪽 메뉴쪽 "Edit" 탭의 "Plugins" 에 들어간 뒤, 검색창에 "HDRIBackDrop" 을 체크 후 재실행해준다.

여기서 "HDRI" 란 한 시점에서 볼 수 있는 모든 앵글과 해당 씬에서 사용되었던 조명의 정보값을 포함한 파노라마 사진을 가리킨다.

https://polyhaven.com/hdris

위의 사이트에서 HDRI를 다운 받을 수 있다.

ies처럼 HDRI를 Content Drawer로 가져오면 material처럼 적용 가능하다.

아무것도 없는 'Blank' 의 새로운 레벨을 생성한다.

"Place Actors" 에서 "HDRIBackDrop" 을 가져오면 레벨 전체에 기존에 설정되어있던 HDRI가 씌워진다.

현 상태에서는 사진의 대부분이 늘어나 있어서 상당히 부자연스럽게 보인다.

오른쪽 "details" 탭의 "Advance" 쪽을 보면 "Use Camera Projection" 이 있는데 이걸 체크하면 좀 더 자연스럽게 보이게 된다.

HDRI는 보통 창문에 쓸 배경 텍스처를 구할 때 사용한다.

 

액터 생성 및 제거, 변화 이벤트 생성

새로운 BP 클래스 "Bp_Ball""Bp_Actor" 을 생성해준다.

"Bp_Ball" 은 'Viewport' 에서 "Sphere" 모양으로 생성하고, "Bp_Actor" 는 'Viewport' 에서 "Collison Sphere" 로 생성한다.

"E_Actor" 라는 이름으로 하나의 "Enumerator" 를 생성해주고, 생성된 "E_Actor" 을 더블클릭하여 enumerator 6개를 생성해주고, 각각 Spawn Actor from Class / Get All Actors Of Class / Get Actor Of Class / For Each Loop / Map Range Clamped 라고 기입해준다.

그 다음 변수 이름을 "E_Actor" 라고 하고, 자료형은 자료형 탭에 "E Actor" 를 검색하여 적용해준 뒤, 해당 변수의 get 노드를 생성한 다음 "Switch on E_Actor" 노드를 생성해준다.

그리고 "Bp_Actor" 의 'Event Graph" 에서 3일차에서 배웠던 "On Component End Overlap" 노드를 통한 기본적인 충돌 동작 노드를 작성하고 레벨에서 변수 연결을 설정해준다.

액터 생성

위의 과정이 끝나면 "Spawn Actor Class" 노드를 생성하고 'Class' 를 "BP_Ball" 로 설정하고 위 사진과 같이 연결

'Compile' 을 누르면 오류가 나서 안되는데, 'Class' 의 스폰위치가 지정되지 않았기 때문이다.

이는 "Spawn Actor Class" 노드의 'Spawn Transform' 을 우클릭 하여 스플릿해줌으로써 해결할 수 있다.

이렇게 될 경우 "Bp_Ball" 이 레벨의 0,0,0 좌표 위치에서 생성된다.

"Get Actor Location" 노드를 생성하여 "Spawn Actor Class"노드의 'Spawn Transform Location' 에 연결해준다.

이렇게 하면 충돌 이벤트 발생 시, "Bp_Ball" 이 충돌 액터가 존재하는 곳에서 생성이 되게 된다.

생성된 액터 제거

"Get All Actors Of Class" 노드를 생성하고 'Actor Class' 를 "Bp_Ball" 로 지정해준다.

그리고 "For Each Loop" 노드, "Destroy Actor" 노드를 생성하고 위 사진처럼 해당 노드들을 연결해준다.

"Get All Actors Of Class" 노드는 레벨 내 'Actor Class' 에 지정된 액터를 전부 검색하는 노드이고, "For Each Loop" 노드를 반복시키는 노드로, 앞의 노드인 검색 과정을 지속적으로 반복해주는 것이다.

"Destroy Actor" 지정된 액터를 파괴하는 노드이다.

즉, 레벨에 생성되어있던 지정된 액터를 레벨에서 검색하여 전부 파괴해주는 것이다.

"For Each Loop" 노드 없어도 BP가 작동해 레벨 내 특정 액터를 제거 가능한, 오류 발생 가능성이 있기에 세트의 개념으로 항상 "For Each Loop" 를 삽입해줘야한다.

생성된 액터 크기 변화

"Get Actor Of Class" 노드와 "Set Actor Scale 3D" 를 생성하여 위 그림처럼 연결해준다.

"Get Actor Of Class" 의 'Actor Class' 를 "BP_Ball" 로 지정해주고, "Set Actor Scale 3D" 의 x, y, z값을 5, 5, 5로 지정해준다.

"Get Actor Of Class" 노드는 레벨 내 특정 액터를 하나 검색하는 노드이고, "Set Actor Scale 3D" 지정된 액터의 x, y, z 스케일을 조정해 주는 노드이다.

즉, 레벨에 생성되어있던 지정된 액터 중 하나의 크기를 5배 키워주는 것이다.