Skip to content
dev-marco-song
Go back

언리얼 엔진에 게임 리프트 적용하기

Edit page

에버노트 플러그인 연동 테스트용. 이후부터는 노트를 정리해서 티스토리 연동시 가독성이 좋도록 작성할 것!!!!

언리얼 엔진에 게임 리프트 적용하기

C ㄴ

https://answers.unrealengine.com/questions/348151/c4577-noexcept-used-with-no-exception-handling-mod.html 여기의 답변을 참고함

In order to fix this, you must add a line to Engine/Source/Programs/UnrealBuildTool/Platform/Windows/VCToolChain.cs inside the function AppendCLArguments_Global: Arguments.Add(“/EHsc”);

Engine\Source\Programs\UnrealBuildTool\Platform/Windows


https://github.com/YetiTech-Studios/UE4GameLiftClientSDK

서버 예제 https://ue4plugin.wordpress.com/2017/06/02/integrate-amazon-gamelift/

클라 예제 https://forums.unrealengine.com/community/community-content-tools-and-tutorials/1372578-free-aws-gamelift-client-plugin-with-blueprint-support

서버 빌드가 오류가 나면서 빌드 안될 때가 많았다. 이럴 때에는 VS에서 ParagonRPG에서 서버를 다시빌드 해주니 잘 작동한다.

아마존 로컬 테스터 실행 cd

cd E:\download\GameLift_12_14_2018\GameLiftLocal-Release-1.0.4

java -jar E:\download\GameLift_12_14_2018\GameLiftLocal-Release-1.0.4\GameLiftLocal.jar -p 9080

arn:aws:gamelift:local::gamesession/fleet123/gsess-8cade87d-7424-49a7-bc2f-809b55c1ccc6

로컬에서 아마존 게임리프트를 실행하고, 게임 서버 실행시 반응하게 됨

aws gamelift create-game-session —endpoint-url http://localhost:9080 —maximum-player-session-count 10 —fleet-id fleet123

aws gamelift describe-game-sessions —endpoint-url http://localhost:9080 —fleet-id fleet123

aws gamelift describe-player-sessions —game-session-id arn:aws:gamelift:local::gamesession/fleet123/gsess-b28b4684-6f28-48cc-b52a-379bbc2f7ff9

클라이언트에서 세션id 확인하고 실행하기

게임 모드에 적용된 AWS 모듈을 내 게임 모드에 추가해야 함 -> 게임모드 복붙 or 커스텀 블루프린트 클래스 생성

생각중인 것 :

1 새로운 게임 모드에 기존 게임 모드의 기능을 복사한다 > 기존 게임 모드의 의존성을 대체할 수 있도록 하는 과정이 힘들 것 같다

2 새로운 클래스를 만들고, 블루프린트에서 호출한다 일단 이걸로 진행 : 구현 완료

매치메이킹 프로세스를 새로 설계해야됨 - flexmatch 활용. all C++

게임서버 플릿 상호작용은 확인됨

파티찾기 -> 매치메이킹 -> 플릿과 상호작용 후 게임 세션 생성

오토스케일링이 되어야겠지.

프로세스가 플릿에 올라가면 -> 포트별로 프로세스(방)들이 구별됨!

매치메이킹 절차를 만들자

플릿 당 10개의 서버 프로세스가 실행된다.

플릿에 있는 프로세스가 가득 차면 -> 새로운 플릿을 생성한다.

https://docs.aws.amazon.com/ko_kr/gamelift/latest/developerguide/match-client.html 아마존 공식 문서

언리얼 서버에 대해서는 설명이 잘 돼 있지만, 클라이언트에 대해서는 설명이 되어 있지 않다

직접 c++ 라이브러리를 가져올 수 있도록 세팅해야 한다. 이에 대한 내용은 아래 링크를 참고함 https://aws.amazon.com/ko/blogs/korea/aws-c-plus-sdk-in-windows-visual-studio/

요약하면 vcpkg로 aws sdk gamelift 라이브러리를 설치하고, 이를 비주얼 스튜디오에서 가져오는 것이다. vcpkg의 신기함을 알 수 있었지만, 자바 개발 툴에 비해 VS는 라이브러리 가져오는 방법이 좀 불편하다.


void UGameLiftLibrary::RequestMatch() { // //     //클라이언트 객체 생성 //     Aws::GameLift::GameLiftClient *client = new Aws::GameLift::GameLiftClient; //      // //     //Amazon.GameLift.Model.StartMatchmakingRequest req = new  Amazon.GameLift.Model.StartMatchmakingRequest(); //     //req.TicketId = matchmakingTicketID; //     //req.Players = new List<A”mazon.GameLift.Model.Player>(); //                    //     /**/ // //     //리퀘스트 객체 생성 //     Aws::GameLift::Model::StartMatchmakingRequest *request = new  Aws::GameLift::Model::StartMatchmakingRequest(); //             //     //플레이어 객체 생성 //     Aws::GameLift::Model::Player *player = new Aws::GameLift::Model::Player(); //      //     request->SetConfigurationName(“ParagonMatchMaker”); // //     //request->SetPlayers(*player); //     //request->SetTicketId(); //                       //     client->StartMatchmaking(*request); // ///* // //Aws::GameLift::GameLiftClient // // //     request->SetTicketId(); //     request->SetConfigurationName*/ // //     //리퀘스트 요청을 Flexmatch에 전송 }

여기를 참고함 https://wiki.unrealengine.com/Creating_%26_Linking_Static_Libraries_And_Make_Your_Own_Blueprint_Node_With_VS_2017_%26_UE4


1. setup.bat에서 런타임 관련 프로그램 설치하기

msvcp140.dll 까시오~  vcredist 까시오~ 이런 에러메시지가 보이면, 패키징을 제대로 안 한 것이다.

아래와 같이, 각종 런타임 프로그램을 배치파일을 통해 설치해주어야 한다.(다운로드도 받아놔야 함)

./install.bat 파일 구성 vc_redist.x64.exe /q dxwebsetup.exe /q

/q는 설치 과정에서 모두 yes로 처리 하라는 배치 명령어임.

게임 리프트 로그를 살펴보면 이런 식으로 로그를 기록함 C:\Game>vc_redist.x64.exe /q C:\Game>dxwebsetup.exe /q Installer Exit Code: 0 exit code가 0이면 정상적으로 설치를 했다는 것임

2. 서버 실행 경로 문제

각종 의존성 모듈을 깔고 실행을 하면 다음과 같은 에러 메시지가 뜬다.

A process unrecognized by GameLift is attempting to make GameLift Server SDK API calls. Are you using a proces****s launcher??

난 분명 서버 프로세스 경로를 잘 잡아줬는데 왜그러지? 파악해보니까, 나는 일종의 바로가기를 실행하고 있었다.  실제 서버 바이너리는 D:\workingfiles\ParagonServer\Binaries\Win64\PragonRPG\Binaries\Win64에 위치한다. 루트 폴더에 위치한 건 프로세스 런처에 해당한다. 그러므로 실행 경로를  Binaries\Win64\PragonRPG\Binaries\Win64~~.exe 로 잡아주면 된다

내가 게임리프트 플릿에 설정한 경로는 다음과 같다. C:\game\PragonRPG\Binaries\Win64\PragonRPGServer.exe

플레이어가 게임을 나갔을 때 RemovePlayerSession()

TerminateGameSession()

Accept Player Session()

CreateSessionPlacement()


코드를 통한 게임 서버 종료가 구현되어야 한다@@@ 게임 세션 종료 -> 게임 서버 프로세스 종료 요청(aws api) -> 게임 서버 프로세스 종료

참고 링크 C++ 클래스를 통해 종료한다는 거 같은데, 내가 시도해보니 작동하지 않는다.. 블루프린트로 호출을 해서 그런가?

https://answers.unrealengine.com/questions/580913/shutting-a-dedicated-server-down-using-blueprints.html

https://answers.unrealengine.com/questions/580913/shutting-a-dedicated-server-down-using-blueprints.html

https://answers.unrealengine.com/questions/405978/dedicated-serverhow-to-give-server-a-notice-when-s.html

다음 유튜브를 참고할 것 https://www.youtube.com/watch?v=L7h0nu8jsp8

프로세스 종료 해결 완료@@ :: 원인은 클라이언트 위젯에서 서버 관련 권한을 요구했기 때문. 플레이어 컨트롤러를 통해 서버 관련 함수와 이벤트를 호출할 수 있었다. -> 주의점 : 서버가 사용하는 플레이어 컨트롤러야 함(메인 컨트롤러 사용하면 동작하지 않음)

프로세스 종료가 잘 되지 않는다면 -> 세션 종료라도 제대로 구현할 것!! 시간이 없다.

TerminateGameSession() onProcessEnding() 이후 AcceptPlayerSession을 서버에서 호출하도록 구현 완료@@@

aws gamelift 각종 커맨드 정리 aws gamelift upload-build —name “ParagonServer” —build-version “build Server Inventory Bug Fixed” —build-root “D:\workingfiles\ParagonServer\WindowsServer0302” —operating-system WINDOWS_2012 —region ap-northeast-2

C:\game\PragonRPG\Binaries\Win64\PragonRPGServer.exe

플레이어 세션 정식으로 생성해서 들어가면 서버 종료 명령어가 올바르게 작동하는 것 확인. IP로 들어가서 하면 안됨 의문점 : 종료됨 상태의 게임 세션은 언제 제거되지?


게임 세션 할당은 한 번만 요청해야 하고, 두 플레이어는 같은 게임 세션에 들어가야 한다.


플레이어 데미지 하향할 것!! -> 조치 완료

보스몹 잡고 게임 안 끝나게 할 것@@@ -> 조치 완료. 30초 후 종료되게 변경

인벤토리가 이상하게 동작하고 있음 -> 웹서버 문제인가?

  1. 골드를 습득해도 골드가 올라가지 않음
  2. 아이템을 먹지도 않았는데 아이템이 세팅돼 있음
  3. -> 근데 싱글로 하면 제대로 동작함. 데디<->클라 문제인듯

로딩은 제대로 동작함.

인벤토리 갱신이 잘 작동하지 않고 있다.

원인 발견 : 인벤토리 갱신 함수가 서버에서 실행됨. -> 원인 : 인터렉트 함수가 서버에서 실행됐기 때문;; -> 블루프린트는 버그 지점을 찾기가 힘들다. 반드시 중요 부분에 로그 처리를 해야 한다. 어떤 액터/오브젝트에서 발생한 이벤트이며, 어떤 이벤트인지 상세히 적어야 나중에 디버깅하기가 편해진다.ㅣ

인터렉트 함수는 서버에서 실행되도록 하고, json 리퀘스트는 소유중인 클라이언트에서 실행하도록 구현하였음



Edit page
Share this post on:

Previous Post
에버노트 플러그인을 이용해 티스토리 연동하기
Next Post
언리얼 엔진 게임에 SHA 512 일방향 암호화(해싱, 해쉬 알고리즘) 적용하기