2Bbear's knowledge workshop

기존 winsock을 이용하여 하는 것이 영 탐탁치 않았던 나는 boost asio를 이용하여 네트워크 통신을 만들어 보기로했다.


============================================================

참고 : https://lunapiece.net/Article/14007572

참고 : https://qiita.com/nia_tn1012/items/77c3c1b006f7c69d30ac


1. boost를 자신의 프로젝트에 추가한다. boost -vc141으로 합시다.

- v120의 경우 Visual Studio 2013 버전

- v140의 경우 Visual Studio 2015 버전

- v141의 경우 Visual Studio 2017 버전

- 단순히 Nuget을 이용하여 추가하는 것이 정신건강에 좋으니 그렇게 하기로 하자


- 다만 이렇게 설치할 경우 

패키지 파일들이 어디에 저장되냐면 솔루션 폴더 내의 package 폴더에 저장되게 됩니다.


신기한건 프로젝트 옵션에 Path나 lib , include를 설정해주지 않아도 링크가 되어있는 점인데요


이것은 프로젝트 파일에 해당 위치가 포함되어 있기 때문입니다.


ExtensionTargets를  추가해서 빌드 targets 파일을 추가 해 놓는 겁니다.


다만 5G가 프로젝트 생성될때마 추가되면 쓸때없이 프로젝트 용량이 계속 증가한다는 이야기가 있네요.... 테스트 용으로만 쉽게 쓰고 버려야 하는 걸까요...



2. 모르겠다... libcurl 를 쓰라는 말도 있고, boost를 이용해서 하라는 말도 있고

참고 : https://curl.haxx.se/libcurl/c/https.html




다양한 방법으로 c++로 http에 접근하는 방법이 있는거 같으나, 간단하게 request하고 response 받는 방법이 필요하기에 이해 할 수 있는 범위 내에서 찾아보자.



다른 방법 없을까..


https://wiki.unrealengine.com/UE4.10_How_To_Make_HTTP_GET_Request_in_C%2B%2B


와아아아 이거 뭐야머야머야?!!!


아냐..이것도...내가 원하는 건 아니야/....거의 맞긴한데...



게임 요구 사항 분석


사용자는

게임을 실행 시킬 수 있어야 한다.

게임을 종료 시킬 수 있어야 한다.


웹서버에 "서버접속"메세지를 통해서, 웹 서버에 접속 할 수 있어야 한다.

웹서버에 "서버 접속해제"메세지를 통해서, 웹 서버 접속을 끊을 수 있어야 한다.


웹서버에 "모든 방 조회"메세지를 통해서, 현재 모든 방을 조회 할 수 있어야 한다.

웹서버에 "??번호 방에 접속"메세지를 통해서, ??방에 접속 할 수 있어야 한다.

웹서버에 "방 생성"메세지를 통해서, 방을 만들 수 있어야 한다.

웹서버에 "자기 방 삭제"메세지를 통해서, 자신이 만든 방을 삭제 할 수 있어야 한다.

웹서버에 "자기 방 게임시작"메세지를 통해서, 자신이 만든 방에서 게임을 시작 할 수 있어야 한다.



웹서버에 "모든 캐릭터 HP조회"메세지를 통해서, 게임 속 모든 캐릭터의 HP 상태를 볼 수 있어야 한다. <이거 가능한 걸까?...초당 몇번을 호출해야해?..>


게임 속 자신의 캐릭터를 이동 시킬 수 있어야한다. <와 이건....초당30~40정도만 해도 어마어마한데..>

게임 속 자신의 캐릭터로 "발사"를 할 수 있어야한다.


웹서버 요구사항 분석



게스트 사용자, 호스트 사용자는 사용자에게 포함된다.

사용자는

웹 서버에 로그인 처리를 한뒤 인증 받고 접속 할 수 있어야한다.

방 리스트를 조회 할 수 있어야 한다.


호스트 사용자로써 방 만들기를 할 수 있어야 한다.

호스트 사용자로써 방 게임을 시작 할 수 있어야한다.

호스트 사용자로서 방 삭제를 할 수 있어야한다.


게스트 사용자로써 방에 접속 할 수 있어야한다.


관리자는

웹 서버를 구동 시킬 수 있어야 한다.

웹 서버를 종료 시킬 수 있어야 한다.



MO 형식의 게임에서 어떻게 데이터를 처리 할 것인지.


1. 필요한 데이터들을 나열 합니다.


오브젝트

- 위치 데이터 (유상태, 30ms, 라이프 사이클 게임 시작-종료, 데이터 매우작음)


플레이어 데이터

- 아이디(플레이어 닉네임) (무상태, 한번만 업데이트, 라이프 사이클 게임시작 - 종료, 데이터 매우 작음)

- HP (무상태, 10ms, 라이프 사이클 게임 시작- 종료, 데이터 매우작음)

- 아이템 수 (무상태, 10ms, 라이프 사이클 게임 시작-종료, 데이터 매우작음)


시스템 데이터


게임 룸 데이터 (여러개 존재 해야함) (무상태 ,?? , 라이프 사이클 방 생성-삭제, 데이터 작음)

- 룸 이름 

- 룸 개설자 

- 최대 인원수

- 현재 입장한 플레이어 아이디

- 게임 진행 상황


게임 로비 데이터 (여러개 존재해야함) (무상태, 요청에 의해서만, 라이프 사이클 서버 시작- 종료, 데이터 작음)

- 현재 로비에 개설된 룸 갯수

- 현재 로비에 있는 유저의 수


인증 데이터 (미러링을 통해 여러 DB를 놓아야 할지도...?) 

- 유저 로그인 처리









목표 :

웹 서버를 이용한 게임을 만들어보자!


장점 : 

HTTPS로 모바일 게임 서버를 만드는 이유- https://coolspeed.wordpress.com/2016/12/09/mobile_game_server_using_https/


그딴거 없다. 라고 말하고 싶은데 일단은 이유가 있어야 시작하니...


1. 접속이 끊겨도 다시 연결하기 간편하다.

2. 다양한 API들이 존재한다.

3. 비동기가 자동 지원된다.

4. 구현이 상대적으로 간단하다.

5. Request-Reply 기반 메세지로 재연결이나 강제 종료 같은 문제에서 자유롭다.

6. Stateless 서버, 연속적인 요청들을 같은 서버가 아니고, 다른 서버들에서 처리할 수 있다.

7. 서버 확장이 용이함 , 로드밸런서 등.


단점 :


1. 서버에서 부터 클라로 가는 메세지를 보낼 수 없다.

- 클라가 서버에 메세지 보내고 바로 서버가 클라로 메세지를 보낼 순 있지만 이 반대 흐름, 즉. 서버가 클라에게 메세지를 보내고 클라가 서버로 메세지를 보내는 과정은 하기 힘들다. 이걸 하기 위해서 웹소켓이라는 것을 사용해야 하고.......


2. TCP 보다 느리다. 이건 좀 심각한거 같은데...


3. 게임은 DB 부하가 생각보다 커서 웹서버로 DB 처리를 하기 위해서는 데이터 캐시 노드, 샤딩 같은 방법을 고려해야 한다.


4. 메세지가 커진다. xml json같은 텍스트 기반 데이터를 주고받는 경우 데이터가 커질 수 있다.

따라서 꼭 필요한 데이터만 주고 받도록 바이너리로 데이터 변환을 하던가 해야한다.






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

결론 : 웹 서버로는 초기 모바일 게임의 형태나, 웹 브라우저에서 작동하는 게임에 적합하다.


2


또는 MO(게임 룸 내에서 제한적으로 플레이하는)형 게임에서 로비서버의 매치메이킹이나 인증 채팅 랭킹과 같은 기능은 별도의 웹 서비스로 구현할 수도 있다.


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

만들 게임의 형태


형태 : MO형태

룸이 있고, 방에 들어가고 , 8명이서 직업을 나눠 갖고

다같이 버티고?


아무튼 이런 형태라는데...


참여 인원 :  3명 (박씨, 장씨, 탁씨 )


3명다 프로그래머래....와아....개노답 삼형제...



내가 맡은 임무는 서버!

이제 서버 개발을 시작하면 된다

1. Coin c++ 클래스 코드를 넣는 것만으로 오류가 발생한다.

- 주된 문제는 C++코드를 JavaScript로 변환하는 과정에서 문제가 생기는 것 같다.

- C++코드를 자바스크립트로 바꾸고 이것을 실행하려고 하면 올바르게 변환되지 않아 실행시 오류가 발생하는 것 같다.


해결 방법 :

C++ 코드로 작성하는 것이 아니라 블루프린트를 이용하여 작성하는 것으로 이러한 문제를 해결하였다. 왜 이렇게 되는지 생각해보면 작성된 C++코드가 올바른 정규 코드가 아니여서 발생하는 문제인 것 같다.



2. 다른 스크립트 코드와 함께 언리얼 js를 호출하면 실행이 안되는 오류

-  확인 안되는 오류지만 먼저 다른 스크립트와 충돌나서 실행이 안되는 걸 수도 있고

-  커져버린 level의 instance 메모리 크기로 인해 간신히 아슬아슬하게 실행 되던 부분을 다른 스크립트들이 메모리를 먹어서 그냥 최대 수용 가능한 메모리를 넘어버린 문제 일 수도 있다.


해결 방법:

못찾음 그냥 기본 level에 있는 걸 들고 오면 잘 실행되길래 ...아무튼 뭔가 기본 level에 넣으려고 하면 터지는거임.




결론 :

UE4로 웹 게임을 개발하는 것은 문제가 많은 것 같다. 아직 이쪽 빌드는 테스트형태로 제대로 된 업데이트가 이루어지지 않은 문제도 있다.


그럼에도 이번 프로젝트로 HTML로 화면을 어떻게 구성해야 하는지 알 수 있었다.

또 Web 게임의 경우 쓰면 안되는 C++ 코드도 알 수 있었다.

destroy(this) 라던지...



============================================================

평가 : 

프로젝트 난이도 - 중

결과 - 하(기대한 게임도 못올렸다.)


얻은 것 - 어떻게 HTML을 꾸미는 지 알 수 있었다.

잃은 것 - 시간.....

열씸히 만들긴 했지만 오늘 문득 HTML5 빌드를 해보니 실행이 안된다...

이럴 거 같았어...메모리 문제 때문에 실행이 안될 것 같았단 말이야....흙흙...



문제

1. HTML에서 감당하기에는 너무 많은 메모리를 사용하려 해서 게임이 실행 되질 않음....

...

해결 방법이 있을까....

만들어야 할 것

- Intro 화면

- InGame 화면

- Ending 화면



1. Intro 화면


간단히 로고 영상을 출력 후 바로 Ingame Level로 전환할 것이다.


참고 : https://youtu.be/uEO_nLnytp0


After effect 2019로 간단히 만든 로고 영상


이제 로고 영상을 Ue4 Intro Level에서 UI로 출력 시키면 된다.


먼저 만들어진 영상을 넣기 위해 



file medi source 를 만들어준다.



이후 만들어진 file media source의 이름은 Ms_Intro2로 하고 이 아이콘을 더블 클릭하면 이런 창이 드는데 여기서 File Path부분을 누르고 방금 만든 logo 영상을 넣어주면 된다.



이후 Media Player를 생성하고



생성 할때 이런 창이 뜨는데 위 사진 처럼 체크 박스에 체크 한 뒤 ok를 누르면 된다.


이후 이름을 설정하면 사진 처럼 아이콘이 2개가 생긴다.


이제 이 영상을 그림으로 보여줄 텍스처를 만듭니다.



마테리얼의 내부 블루프린트는


위 사진의 details를 따라서 해주시고


Texture Sample로는 방금 만들어진 MP_Intro2_Video를 드래그엔 드롭 후 연결을 해줍니다.


이제 Level blueprint를 Open합니다.



그후 내부 블루프린트를 아래의 사진과 같이 해줍니다.



NextLevelName의 타입은 Name이고 기본 값으로 다음 Level의 이름을 갖고 있습니다.




이렇게 인트로 화면이 만들어 졌습니다.



참고 :

https://www.youtube.com/watch?v=7OEbO353_GM 

UE4 Media Player to Render a Media Texture

https://www.youtube.com/watch?v=LwEu2PqqCIo

Unreal Engine 4 HUD: Widget Blueprint Tutorial