Nexon Supporters Hackathon 07

이태곤·2022년 9월 27일
0
post-thumbnail

Index

  1. MOD 네트워크 소개

  2. Property 동기화 & 실행제어

  3. Function 실행제어

  4. Function 실행제어 예시

  5. 타이밍 이슈


MOD 네트워크 소개

  • MOD에서의 네트워크는 Server-Client 구조를 기반으로 구성되어있다.

  • Server : Client로부터의 요청처리, 게임에 전반적인 시스템과 기능을 담당

  • Client : 게임에서 플레이를 하고있는 각각의 유저를 의미

  • 보통은 Server가 전체적인 기능과 흐름을 제어한다. 하지만 UI, 사용자입력, 특정 유저에게 이펙트 연출과 같이 특정 플레이어에 대해서만 로직이 필요하고 디테일한 설정이 필요시 --> Client가 관리

ex) 스탯창 띄우기, 몬스터에게 맞았을 때 hp감소 등


Property 동기화 & 실행제어

  • Entity를 생성하게되면 해당 Entity는 Server와 Client에 독립적으로 생성되게 된다.
  • 동기화의 필요성 : 생성된 Entity에 대해, Server에서 Property값을 변경하게되면 Client에 있는 Property값이 업데이트되지 않음 --> 각각은 독립적인 객체이기 때문에

따라서, Server<->Client 양쪽의 Property 값을 동일하게 만들어주는 동기화(Synchronization) 필요!

  • MOD에서 동기화는 단방향으로 이루어지고 있다.

Server에서 Property값 변경시 -> Client의 Property값에 반영

Client에서 Property값 변경시 -> Server의 Property값에 반영되지 않음


  • Sync : Property 동기화 ON

  • None : Property 동기화 OFF

-> 앞에 자료형을 클릭하면 다양한 Property의 자료형을 확인해볼 수 있다.

-> 각 자료형마다 Sync 또는 None 값을 선택할 수 있지만 any, table은 동기화를 제공하지 않는 None값만 가질 수 있다.


  • OnSyncProperty : Property값의 변경을 감지할 수 있는 함수이며 매개변수로 변수이름과 값을 가진다.

ex) 플레이가 시작되면 num값이 1증가 -> "num"의 value값 변경을 감지하고 문구를 출력한다.


Function 실행제어

  • 함수가 실행되는 공간은 함수가 어디로부터 호출이되느냐에 따라 Client / Server 두 개로 나누어볼 수 있다.

따라서, 함수가 실행될 공간을 명확하게 미리 설정해 놓음으로써 보다 간단하고 효율적인 구현이 가능하며 어디로부터 호출되었는지를 알고 흐름을 쉽게 제어할 수 있다. --> 함수의 실행제어

  • Function Setting을 통해 함수의 실행공간 5가지를 확인할 수 있다.
  1. Client : 클라이언트에서 실행되어지도록 한다.

cf) 만약 서버가 클라이언트함수를 호출하면 서버와 연결된 모든 클라이언트들에게 함수호출을 요청하고 클라이언트에서 실행되어지도록 한다.

  1. ClientOnly : 클라이언트에서만 호출되어 실행될 수 있다.

  2. Server : 서버에서 실행되어지도록 한다.

cf) 만약 클라이언트가 서버함수를 호출하면 서버에게 함수호출을 요청하고 서버에서 실행되어지도록 한다.

  1. ServerOnly : 서버에서만 호출되어 실행될 수 있다.

  2. Multicast : 서버에서만 호출되어 서버와 클라이언트 양쪽모두에서 실행된다.


ex) SeverOnly환경에서 ClientOnly함수를 제외하고 모두 호출될 수 있다. --> ClientOnly는 클라이언트에서만 호출될 수 있기 때문이다.

  • 반대로 ClientyOnly환경에서 ServerOnly함수를 제외하고 모두 호출될 수 있다.

Function 실행제어 예시

server only환경을 가진 OnBeginPlay함수에서의 호출을 가정


  • Example 1
  1. Start

  2. 클라이언트 공간에서만 실행되는 clientonly는 콘솔 결과창에 출력되지 않음

  3. server only공간에서 실행 된 serveronly 출력

  4. End


  • Example 2
  1. Start

  2. 클라이언트에게 client출력 요청을 보냄

  3. 서버공간에서 실행 된 server 출력

  4. End

  5. 요청을 받은 클라이언트에서 client 출력

cf) End가 client보다 빨리 나오는 이유 : 서버는 클라이언트에게 함수실행 요청을 보내고 서버는 본인의 로직을 계속해서 수행하기 때문이다.

만약 코드가 작성된대로 출력을 원한다면? ex) Start->client->server->End

--> 클라이언트가 요청을 받고 그 요청을 처리할때까지 wait함수를 통해 기다려주면 된다.


  • Example 3
  1. Start

  2. 클라이언트에게 client출력 요청을 보냄

  3. 서버공간에서 실행 된 server 출력

  4. 서버공간에서 실행 된 multicast 출력

  5. 클라이언트에게 multicast출력 요청을 보냄

  6. End

  7. 요청을 받은 클라이언트에서 client 출력

  8. 요청을 받은 클라이언트에서 multicast 출력


cf) client출력 요청을 먼저 받고 그 후에 multicast요청을 받았으므로 콘솔화면에서의 결과창 출력 또한 요청받은 순서를 보장받는다.


타이밍 이슈


  • Entity에 작성한 Component를 추가해주고 왼쪽과 같은 함수를 수행해보니 client가 출력되지 않아서 한시간 넘게 고민했다.

  • Default Player에 Component를 추가한 모습

  • Entity가 아닌 Default Player에 작성한 Component를 추가해주니 정상적으로 client가 출력되는 모습을 확인할 수 있었다.

  • Entity에 추가했을때와 Default Player에 추가했을 때의 차이점?

--> Default Player는 OnBeginPlay가 실행되기 전에 생성되어있다.

--> Entity는 OnBeginPlay가 실행되기전에 각 클라이언트에게 생성이 되지 않았을수도 있다.

따라서, OnBeginPlay가 실행되기전에 Entity가 생성될 충분한 시간을 부여해줬다. --> wait(5)


  • Entity에 Component를 추가하고 정상적인 결과를 얻은 콘솔화면
  • 결론 : client가 출력되었다.

--> 함수실행전에 Entity가 각 클라이언트 환경에 생성될 수 있는 충분한 시간을 부여한 후에 함수를 실행 해주게되면 client에서의 로직이 정상적으로 실행되는것을 확인할 수 있다.

(호기심 해결하는데 많은도움준 스물다섯,스물하나 Peer Group 감사합니다!!!)

0개의 댓글