저번 포스팅에 이어서 이번에는 UE ContentExamples
의 남은 데모들에 대해서 알아보려고 한다. 분량상 모든 부분을 다 다루지는 못하지만, 네트워크, 블루프린트, 나나이트, 파티클 시뮬레이션, 2D sprite의 인상적이였던 데모들을 기록해 보았다.
Unreal Network
에서는 다른 Map들과 Player 2명에 Netmode를 Listen Server로 두어 client 화면 1개, server 화면 1개로 만들고 데모를 돌려보았다. 솔직히 이 프로젝트에서 네트워크까지 다뤄줄지 몰랐는데 감사하다(네트워크 데모쪽 분량이 적은건 살짝 아쉽다)
첫번째는 Variable Replication
이다. 2명의 유령이 있는데 각 유령 위에는 체력이 일정 시간마다 깎인다. 두 유령의 차이가 있다면 왼쪽 유령은 체력 변수가 Replicate
되지 않고 오른쪽은 된다. Replicate
되지 않는 변수는 변수를 감소시키는 로직이 들어있는 서버쪽에서만 변경이 확인되고 그 값을 client쪽에서는 확인할 수 없다. 그에 반해 Replicate
되는 변수는 서버쪽에서 변경하고 그 이후에 서버와 연결된 모든 client들에게 변경 사실을 알려주므로 client에서도 Replicate
된 값을 확인할 수 있다.
다음은 Network Relevancy
에 대한 데모였다. Map에서는 총 4가지의 상황을 두었지만, 가장 중요한 2가지 상황(Part III와 Part IV)에 대한 gif를 땄다.
Part III은 플레이어가 chest를 열고 다른 플레이어가 chest의 Relevancy 반경(gif상에서는 파란색 테두리)에 들어오는 순간 chest가 열리는 VFX+변한 상자의 외형을 동시에 확인할 수 있다. 이는 RepNotify
로 구현했는데, 상자의 열림/닫힘에 대한 bool 변수를 Replication 변수로 두었고, chest가 열리는 VFX의 실행을 해당 변수의 RepNotify
함수에 넣었다. 플레이어가 chest를 열면 bool 변수가 변하고, 다른 플레이어가 반경 안으로 들어오는 순간 RepNotify
함수가 실행되는 것이다.
Part IV에서는 플레이어가 chest를 열고 다른 플레이어가 chest의 Relevancy 반경(gif상에서는 파란색 테두리)에 들어오면 chest가 열리는 VFX 없이 변한 상자의 외형만 확인할 수 있다. 여기서는 Multicast
함수와 chset의 열림/닫힘에 해당하는 Replication 변수를 사용했다. Multicast
함수 안에는 chest가 열리는 VFX가 들어있어서 상자가 열릴 때 server가 자신과 접속한 모든 플레이어 중 Relevancy 반경 안의 플레이어들에게만 VFX를 보여준다. 따라서 나중에 상자 근처에 온 플레이어는 VFX는 보지 못하고 Replication 된 변수를 통해 상자가 열리는 모습만 보게 된다.
Blueprint
가 워낙 방대한 분량이라서 그런지 많은 데모들이 있었는데, 그 중에서 가장 재밌었고 유용했던 2가지 데모를 찍었다.
하나는 Blueprint Interface
에 관한 것이다. 게임 프로젝트를 처음 시작할때 Interface
에 중요하다는 사실은 알았지만 도대체 이걸 어디에 어떻게 적용할지가 굉장히 추상적이었다. 지금에서야 좀 이해가 되는데, 다음 데모 예시를 보면 이해에 더욱 도움될 것이라 생각한다.
데모에서 보이는 3가지 구체는 생김새는 다르지만, 불과 물에 반응한다는 공통점을 가지고 있다. 여기서, 이 공통점을 바로 Interface
로 만들 수 있다. 이를 Interface
로 만들고 3개의 구 클래스가 이를 상속하게 된다면, 구 클래스들은 불과 물에 반응하지만 각각의 상호작용 효과는 개별적으로 구현하는 것이다. 데모와 같이 말이다.
쇠 구슬 : 빨갛게 표면이 달아오름(불 쐈을때), 표면이 반짝반짝거림(물 쐈을때)
나무 구슬 : 표면이 불에 탐(불 쐈을때), 표면이 탄 목재로 변함(물 쐈을때)
얼음 구슬 : 점점 작아짐(불 쐈을때), 점점 작아짐(물 쐈을때)
좀더 확장성 있게 간다면 Interactable Interface라는 것을 만들어서 사용자와 상호작용하는 모든 클래스가 이를 상속하게 만들 수도 있는데, 다음에 기회가 된다면 시도해 보도록 하자.
다음 Blueprint 데모는 Construction script
이다. Construction Script는 엑터가 월드에 추가되거나 변경될 때 자동 실행되는 초기화 코드 블록이다. 언리얼의 Actor Lifecycle 관점에서 보자면, Construction Script
는 게임 실행 전의 "설정" 역할만 수행하고, BeginPlay
이후에는 실행되지 않는다. 변수에 따라서 Actor의 외형이 변하는데 이를 게임 시작전에 레벨에서 바로바로 확인할 경우가 있으면 Constrcution Script
(C++에서는 OnConstruction을 오버라이딩해서), 안에 해당 로직을 집어 넣자.
Nanite
는 언리얼 엔진의 가상화된 폴리곤 렌더링 기술이다. 수십억 개의 폴리곤을 가진 모델을 실시간으로 렌더링하여 메시를 보여준다. 기존에는 LOD마다 거기에 해당하는 메시를 만들어서 거리에 따라서 메시를 바꿔치기 하는 방법을 사용했다면, 나나이트는 LOD를 자동으로 최적화해서 멀리 있거나 작게 보이는 오브젝트는 자동으로 폴리곤 감소시킨다! 이렇게 되면, GPU적으로 엄청나게 자원 소모를 줄일 수 있다고 한다.
밑의 예시에서 플레이어가 향하는 기둥을 자세히 봐보자. 거리가 가까워질수록 LOD값은 높아져서 개별 폴리곤 수는 작아지고 총 폴리곤의 수는 증가하는 것을 볼 수 있다.
내가 아는 언리얼에서 물리 시뮬레이션은 Simulate Physic과 Collision에서의 Query and Physics 밖에 없다. Fluid Simulation에 대한 데모가 있길래 신기해서 촬영해봤다. 조그만 입자들에 물리를 줌과 동시에 어떻게 연산 최적화가 가능지도 궁금하고 자연스러운 물 텍스쳐를 렌더링하는 방법도 궁금하다.
예전의 언리얼 홍보 영상중에서 가상의 오락실을 만든게 있었는데, 오락실 안의 각각의 오락기에서는 서로 다른 미니 게임들이 동영상처럼 플레이되고 있었다. 나중에 그 홍보 영상을 만드신 Ed Bernett이라는 분께서 오락기 위의 영상은 Flipbook
을 통해서 만들었다고 해서 인상 깊게 기억이 있다. 그런데 이번에, UE ContentExamples
2D Sprite 부분을 보다가 Flipbook
관련 데모가 나와서 가져와봤다.
설명을 보면, Flipbook
을 만드는 2가지 방법이 있는데 하나는 단일 texture에서 frame animation을 추출하는 방법이고 다른 하나는 같은 애니메이션을 가지는 "Frame Run"들을 통해서 만든다고 적혀있다.
이해가 잘 안되서 좀 쉬운 설명을 찾아봤다. Flipbook
은 여러 개의 2D 스프라이트(정적인 이미지)를 시간 순서대로 순차적으로 보여주어 애니메이션을 구현하는 시스템이라고 한다. 언리얼 엔진에서는 Paper2D 시스템을 통해 Flipbook
애니메이션을 만들며, 각 스프라이트를 설정된 시간 간격으로 반복 재생하거나 한 번만 실행하여 2D 캐릭터나 오브젝트의 애니메이션을 제어한다고 한다. GIF가 작동하는 방식과 비슷한 것 같다.