MOD 네트워크 소개
Property 동기화 & 실행제어
Function 실행제어
Function 실행제어 예시
타이밍 이슈
MOD에서의 네트워크는 Server-Client 구조를 기반으로 구성되어있다.
Server : Client로부터의 요청처리, 게임에 전반적인 시스템과 기능을 담당
Client : 게임에서 플레이를 하고있는 각각의 유저를 의미
보통은 Server가 전체적인 기능과 흐름을 제어한다. 하지만 UI, 사용자입력, 특정 유저에게 이펙트 연출과 같이 특정 플레이어에 대해서만 로직이 필요하고 디테일한 설정이 필요시 --> Client가 관리
ex) 스탯창 띄우기, 몬스터에게 맞았을 때 hp감소 등
따라서, Server<->Client 양쪽의 Property 값을 동일하게 만들어주는 동기화(Synchronization) 필요!
Server에서 Property값 변경시 -> Client의 Property값에 반영
Client에서 Property값 변경시 -> Server의 Property값에 반영되지 않음
Sync : Property 동기화 ON
None : Property 동기화 OFF
-> 앞에 자료형을 클릭하면 다양한 Property의 자료형을 확인해볼 수 있다.
-> 각 자료형마다 Sync 또는 None 값을 선택할 수 있지만 any, table은 동기화를 제공하지 않는 None값만 가질 수 있다.
ex) 플레이가 시작되면 num값이 1증가 -> "num"의 value값 변경을 감지하고 문구를 출력한다.
따라서, 함수가 실행될 공간을 명확하게 미리 설정해 놓음으로써 보다 간단하고 효율적인 구현이 가능하며 어디로부터 호출되었는지를 알고 흐름을 쉽게 제어할 수 있다. --> 함수의 실행제어
cf) 만약 서버가 클라이언트함수를 호출하면 서버와 연결된 모든 클라이언트들에게 함수호출을 요청하고 클라이언트에서 실행되어지도록 한다.
ClientOnly : 클라이언트에서만 호출되어 실행될 수 있다.
Server : 서버에서 실행되어지도록 한다.
cf) 만약 클라이언트가 서버함수를 호출하면 서버에게 함수호출을 요청하고 서버에서 실행되어지도록 한다.
ServerOnly : 서버에서만 호출되어 실행될 수 있다.
Multicast : 서버에서만 호출되어 서버와 클라이언트 양쪽모두에서 실행된다.
ex) SeverOnly환경에서 ClientOnly함수를 제외하고 모두 호출될 수 있다. --> ClientOnly는 클라이언트에서만 호출될 수 있기 때문이다.
server only환경을 가진 OnBeginPlay함수에서의 호출을 가정
Start
클라이언트 공간에서만 실행되는 clientonly는 콘솔 결과창에 출력되지 않음
server only공간에서 실행 된 serveronly 출력
End
Start
클라이언트에게 client출력 요청을 보냄
서버공간에서 실행 된 server 출력
End
요청을 받은 클라이언트에서 client 출력
cf) End가 client보다 빨리 나오는 이유 : 서버는 클라이언트에게 함수실행 요청을 보내고 서버는 본인의 로직을 계속해서 수행하기 때문이다.
만약 코드가 작성된대로 출력을 원한다면? ex) Start->client->server->End
--> 클라이언트가 요청을 받고 그 요청을 처리할때까지 wait함수를 통해 기다려주면 된다.
Start
클라이언트에게 client출력 요청을 보냄
서버공간에서 실행 된 server 출력
서버공간에서 실행 된 multicast 출력
클라이언트에게 multicast출력 요청을 보냄
End
요청을 받은 클라이언트에서 client 출력
요청을 받은 클라이언트에서 multicast 출력
cf) client출력 요청을 먼저 받고 그 후에 multicast요청을 받았으므로 콘솔화면에서의 결과창 출력 또한 요청받은 순서를 보장받는다.
Default Player에 Component를 추가한 모습
Entity가 아닌 Default Player에 작성한 Component를 추가해주니 정상적으로 client가 출력되는 모습을 확인할 수 있었다.
--> Default Player는 OnBeginPlay가 실행되기 전에 생성되어있다.
--> Entity는 OnBeginPlay가 실행되기전에 각 클라이언트에게 생성이 되지 않았을수도 있다.
따라서, OnBeginPlay가 실행되기전에 Entity가 생성될 충분한 시간을 부여해줬다. --> wait(5)
--> 함수실행전에 Entity가 각 클라이언트 환경에 생성될 수 있는 충분한 시간을 부여한 후에 함수를 실행 해주게되면 client에서의 로직이 정상적으로 실행되는것을 확인할 수 있다.
(호기심 해결하는데 많은도움준 스물다섯,스물하나 Peer Group 감사합니다!!!)