Function Replication을 설정하여 모든 클라이언트에게 특정 기능을 실행하도록 하는 예


Dedicated Server를 통해 게임을 호스팅하려면 별도의 언리얼 엔진 소스를 컴파일하여 사용해야 하지만 Listen Server는 다른 준비가 필요 없고 언리얼 엔진 설치 버전만 있다면 바로 개발이 가능하다. 여기서는 Listen Server에서 실행될 간단한 네트워크 기능을 테스트하려고 한다.


플레이어1, 플레이어2가 한개의 큐브 액터를 클릭할 때마다 큐브 액터가 튕겨져 나가도록 하고 양쪽 플레이어의 윈도우에서 큐브의 움직임이 동기화되어 움직이도록 한다


Default Pawn을 기반으로 커스텀 폰 클래스 블루프린트 생성

Game Mode 를 기반으로 커스텀 게임모드 클래스 블루프린트 생성

커스텀 게임모드에 커스텀 폰 클래스 등록

언리얼 레벨 에디터의 월드세팅 / Game Mode 에 커스텀 게임모드 등록


뷰포트에 PlayerStart 2개가 플로어의 양단에 오도록 배치한다


Actor Replication 설정

클라이언트들이 공유할 액터를 생성한다(StaticMeshActor를 기반으로 한 클래스 블루프린트 생성)


아래의 그림과 같이 액터에 Replication을 설정한다. 서버측에서 큐브의 위치가 변경되면 클라이언트에게도 반영되도록 설정한 것이다.


생성한 큐브 액터를 뷰포트에 배치한다

큐브 액터가 Static이 아닌 Movable 으로 설정하고 Simulate Physics 도 체크한다


커스텀 폰 클래스의 [이벤트 그래프]에 다음과 같은 내용을 작성한다


Function Replication 설정

위의 그림에서 하단에 위치한 커스텀 이벤트를 선택하고 다음과 같이 설정한다. [서버에서 실행] 타입의 함수는 클라이언트에서 호출하고 서버에서 실행되는 함수를 말한다. 내부에서는 RPC(Remote Procedure Call)방식이 이용된다. 서버측에서 큐브의 위치가 변경되면 큐브액터는 Replicates 설정되어 있으므로 클라이언트에게도 반영된다.


게임을 실행할 때 Dedicated Server를 시뮬레이션하기 위해 아래처럼 실행한다


다음과 같이 2개의 윈도우에 게임이 실행되고 각 윈도우에서 마우스로 큐브를 클릭하면 양쪽 윈도우에서 큐브가 동기화되어 튕겨 나가는 것을 확인할 수 있다


폰 클래스를 Default Pawn을 사용하지 않고 ThirdPersonCharacter를 복사해서 사용하면 2명의 플레이어에 의해 제어되는 2개의 캐릭터를 뷰포트에서 확인할 수 있다


Posted by cwisky
Billiard/TextRender2017. 10. 31. 17:08

언리얼 엔진의 TextRender를 이용할 때 한글이 깨지는 문제 해결


블루프린트 액터에 TextRender 컴포넌트를 추가해서 영어를 출력하면 다음과 같이 아무런 문제가 없는 것을 확인할 수 있다. 그러나 한글을 출력하기 위해 입력하면 제대로 한글이 출력되지 않는 문제가 발생한다. 


TextRender 에 영어를 출력하면 문제가 없다



TextRender를 통해 출력한 한글이 깨지는 현상



언리얼 엔진(4.16.3)에서 위의 문제를 해결하기 위한 방법은 로컬 시스템에서 지원하는 폰트를 등록하고 사용하면 된다. 

좀더 구체적으로 설명하자면 언리얼 컨텐트 뷰에서 폰트를 새로 생성하여 현재 시스템에서 지원하는 폰트를 찾아 등록하고 생성된 폰트를 TextRender에 설정하여 사용하면 된다.


새로운 폰트 생성

컨텐트 브라우저에서 마우스 우측을 누르고 [User Interface > 폰트] 를 선택하고 이름을 Font_KO 등으로 지정한다



새로 생성된 Font_KO를 더블클릭하여 에디터를 열고 [디테일]뷰 / Font / Font Chche Type 항목에서 Runtime 대신 Offline 으로 설정하면 다음과 같이 묻는 창이 뜬다



글꼴 선택 창에서 지원되는 한글 글꼴과 스타일, 크기를 선택하고 [확인] 버튼을 누른다



아래의 그림에서 [디테일]뷰/Font/Font Cache Type 항목이 Offline으로 변경된 것을 확인할 수 있다. 

아래의 창에서 [디테일/Import Options/Chars] 항목에 표준한글 문자를 복사해 넣으면 된다. 한글 표준문자는 아래에 첨부된 텍스트파일에 저장되어 있으므로 다운로드하여 메모장으로 열고 모두 복사하여 Chars항목에 붙여 넣으면 된다

KS-1001.txt

아울러 Texture Page Width, Texture Page Max Height 항목도 1024로 변경한다



폰트 에디터의 툴바에서 [애셋> Font_KO 리임포트] 항목을 선택하고 [저장] 을 누른다



TextRender 컴포넌트에 새로운 폰트 설정

폰트 에디터를 닫고 언리얼 레벨 에디터로 이동하여 TextRender 를 선택하고 [디테일]뷰 / Text / Font 항목에서 Font_KO를 선택한다



텍스트 머티리얼도 변경해야 하므로

위의 화면에서 Font 항목 위의 Text Material 항목에 있는 돋보기 아이콘을 클릭하고 컨텐뷰에 있는 텍스트 머티리얼을 찾아 더블클릭하여 머티리얼 에디터를 연다.



위의 화면에서 Font 노드의 R 핀에 Lerp노드의 Alpha 핀이 연결되어 있는데 아래의 그림과 같이 Font 노드의 Alpha 핀이 Lerp의 Alpha 핀에 연결되도록 변경하고 Font 노드가 선택된 상태에서 [디테일]뷰 / Material Expression Font Sample / Font] 항목에서 앞서 생성된 Font_KO를 선택하고 툴바에서 저장 버튼을 누른다



TextRender 에 한글출력 테스트

머티리얼 에디터를 닫고 언리얼 레벨 에디터로 돌아가서 TextRender 컴포넌트에 한글이 제대로 출력되는지 확인한다



게임을 실행했을 때도 제대로 한글이 출력되는지 확인한다



보다 실용적인 예제로, 마우스로 액터를 클릭할 때 클릭된 횟수를 TextRender에 출력하는 블루프린트를 작성해본다. 아울러 TextRender가 카메라를 향하여 항상 정면을 보이도록 회전하게 한 내용이다



Posted by cwisky
Event/Event Binding2017. 10. 29. 14:55

Event Binding을 통해 클래스 블루프린트에서 레벨블루프린트 내의 커스텀 이벤트 호출하기


클래스 블루프린트에서 Event Dispatcher 를 생성하고 파라미터 자료형을 설정하고 드래그하여 이벤트 디스패쳐 호출 노드를 생성하고 파라미터에 값을 입력한다. 아래는 EvtDisp 란 이름의 이벤트 디스패쳐를 생성한 경우이다


레벨블루프린트에서 연결하고자 하는 액터의 참조를 구하여 노드를 생성한 후 연결핀을 드래그하여 [EvtDisp에 이벤트 바인딩] 항목을 선택한다



이벤트 바인딩 노드에서 이벤트 핀을 드래그하여 놓고 [Custom Event 추가...] 항목을 선택한다


커스텀 이벤트 이름을 지정하고 로직을 작성할 때 수신된 파라미터를 사용할 수 있다

아래의 내용은 Cube_Blueprint 클래스의 이벤트 디스패쳐와 레벨블루프린트의 MyCustomEvent 가 바인딩되어 있는 예이다. 

BeginPlay 이벤트가 호출되면 Cube_Blueprint 클래스의 이벤트 디스패쳐와 레벨 블루프린트의 커스텀 이벤트인 MyCustomEvent 가 서로 바인딩되고 Cube_Blueprint 클래스에서 호출하면 실행될 준비가 된 상태이다


게임을 실행하고 클래스 블루프린트에서 EvtDisp 이벤트 디스패쳐가 호출되면 레벨블루프린트에 작성된 MyCustomEvent 가 호출되며 전달된 파라미터도 사용할 수가 있다

Posted by cwisky