에버노트 플러그인 연동 테스트용. 이후부터는 노트를 정리해서 티스토리 연동시 가독성이 좋도록 작성할 것!!!!
언리얼 엔진에 게임 리프트 적용하기
- C4577 관련 패키징 오류가 발견됨
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/
- 서버 빌드 과정
서버 빌드가 오류가 나면서 빌드 안될 때가 많았다. 이럴 때에는 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개의 서버 프로세스가 실행된다.
플릿에 있는 프로세스가 가득 차면 -> 새로운 플릿을 생성한다.
- 언리얼 클라이언트에 AWS C++ SDK 적용하기
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에 전송 }
- cpp 라이브러리 프로젝트에 적용하기
- 게임 리프트 플릿에서의 서버 실행 문제 해결
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://www.youtube.com/watch?v=L7h0nu8jsp8
프로세스 종료 해결 완료@@ :: 원인은 클라이언트 위젯에서 서버 관련 권한을 요구했기 때문. 플레이어 컨트롤러를 통해 서버 관련 함수와 이벤트를 호출할 수 있었다. -> 주의점 : 서버가 사용하는 플레이어 컨트롤러야 함(메인 컨트롤러 사용하면 동작하지 않음)
프로세스 종료가 잘 되지 않는다면 -> 세션 종료라도 제대로 구현할 것!! 시간이 없다.
- accept player 가 동작은 하는데, 동작 이후 서버가 멈춰버린다.
- 다시 빌드하니 정상 동작 확인.
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초 후 종료되게 변경
인벤토리가 이상하게 동작하고 있음 -> 웹서버 문제인가?
- 골드를 습득해도 골드가 올라가지 않음
- 아이템을 먹지도 않았는데 아이템이 세팅돼 있음
- -> 근데 싱글로 하면 제대로 동작함. 데디<->클라 문제인듯
로딩은 제대로 동작함.
인벤토리 갱신이 잘 작동하지 않고 있다.
원인 발견 : 인벤토리 갱신 함수가 서버에서 실행됨. -> 원인 : 인터렉트 함수가 서버에서 실행됐기 때문;; -> 블루프린트는 버그 지점을 찾기가 힘들다. 반드시 중요 부분에 로그 처리를 해야 한다. 어떤 액터/오브젝트에서 발생한 이벤트이며, 어떤 이벤트인지 상세히 적어야 나중에 디버깅하기가 편해진다.ㅣ
인터렉트 함수는 서버에서 실행되도록 하고, json 리퀘스트는 소유중인 클라이언트에서 실행하도록 구현하였음