ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023-10-11 : 변수 valid 체크 및 네트워크
    언리얼 2023. 10. 11. 16:54

    변수 get과 valid 체크를 동시 진행.

     

     

     

    서버인지 아닌 지를 체크.

    authority - server

    remote - client

     

     

     

    오버랩 체크 계산 과정이 서버에서만 실행될 수 있도록 overlap begin 노드 이후 바로 authority 체크해주기.

    Overlapped Event 이벤트 노드 내에서 authority 체크해 줄 경우, 

    네트워크 상의 모든 host에서 overlap 계산이 발생한다.

    authority 체크를 통해 서버에서만 실행시켜 준 이벤트는 run on server 체크를 굳이 해줄 필요가 없다.

    서버에서 실행시켜 준 뒤, 모든 클라이언트에도 실행되어야 하는 경우, 

    replicate - multicast 항목으로 체크해주는 게 좋다. 

    multicast 항목 중 반드시 표현되어야 하는 항목은 reliable 체크를 꼭 해주도록 한다.

     

     

     

    액터 내에서 리플리케이트 되는 프로퍼티나 이벤트가 존재하는 경우

    액터의 replicate 항목을 체크해줘야 한다.

     

    액터 선택 후, 액터의 detail 창에서 replicate 설정.

    : 서버에서 해당 액터 스폰해준 경우, 모든 접속 host에도 자동 replicate 수행 (접속한 모든 클라이언트 상에도 스폰됨.)

     

    ** 액터의 replicates 설정을 해줘야 클라이언트에도 (액터 상에서 발생하는)작업이 적용된다.

    + replicate 설정

     

     

    초당 replicate 수행하는 횟수

    업데이트가 자주 발생하지 않는 경우, 수를 낮춰주는 게 좋다. 

     

    ** 보통 캐릭터가 100 frequency를 갖고, 액터의 경우 10 정도가 좋다.

     

    relevancy : 연관성

    대역폭의 최적화와 관련있는 옵션.

    만약 엄청 큰 맵에서 클라이언트는 보이지 않는 부분의 액터에서 일어나는 정보까지 받을 필요가 없다. 

    따라서 연관성 있는(여기서 연관성이 있다는 것은 해당 플레이어 시야에 있는 다른 플레이어 혹은 액터, 상호작용하고 있는 액터, 혹은 근처에 있는 액터를 의미한다.) 액터의 네트워크 데이터만을 수집한다.

     

    Only Relevant to Owner : 소유 클라이언트에만 관련

    (ex) PlayerController는 그 컨트롤러를 소유하고 있는 Player에만 관련.

    잘 사용하지 않으며, 이를 체크해주는 경우는 해당 owner에만 적용되는 경우만 체크해준다. 

    보통 네트워크 환경에서는 모든 클라이언트에 결과가 보여져야 하므로, 잘 사용하지 않는다.

     

    Always Relevant : 항상 모든 클라이언트와 관련

    (ex) GameState와 PlayerState는 모든 클라이언트에 관련.

     

     

    변수 내에서 replication 체크 가능.

    -> 네트워크 상에서 변수 값의 체킹이 필요한 경우 체크.

     

    replicated : 변수의 값이 변할 때마다 다른 host 모두가 그 변화를 알 수 있도록 함.

    한 프레임 내에 변수가 여러번 변경되는 경우, 값의 변경을 감지하지 못하며,

    이전 프레임과 값의 차이가 없을 경우 리플리케이션 고려 대상이 되지 않기 때문에

    서버에서만 replicated 변수를 변경 후, 리플리케이션을 통해 클라이언트에서 이를 인지할 수 있도록 하는 게 좋다. 

     

    repNotify : replicated 되는 변수에 변화가 발생했을 때, 게임 로직이 실행되어야 하는 경우 체크.

     

     

    repNotify 해준 변수의 경우, 

    변수의 set이 호출될 경우, 자동 생성된 replicate 함수가 호출된다.

    해당 함수를 더블 클릭하여, replicated된 변수에 변화가 생길 경우 실행될 게임 로직을 작성해줄 수 있다.

    블루프린트에서 해당 로직은 서버에서 호출되는 경우, 클라이언트에서도 동일한 함수를 호출하며

    클라이언트에서 해당 로직이 호출되는 경우, 서버에서도 동일한 함수를 호출한다. 

     

     

    RepNotify 함수는 오버라이드가 되지 않기 때문에,

    RepNotify 함수 내부에서는 함수를 호출해서 작업해주는 것이 좋다.

    RepNotify 함수를 오버라이드 하고 싶은 경우, RepNotify에 연결해준 함수들을 오버라이드 시켜주면 된다.

    + RepNotify 함수 호출 시점

    1. 값을 set 해주는 경우 = 값의 변경이 일어나는 경우

    2. 해당 값이 replicate 되는 경우 = 네트워크를 통해 값의 변경이 일어나는 경우 

     

    ** Set 해준 값이 이전 값과 동일한 값인 경우(=값의 변화가 없는 경우) On Rep 함수가 호출되지 않는다.

     

     

    RepNotify 실행 예제

    + on post log in 이벤트를 통해 game state의 player list 배열(player state를 담은 배열)을  변경해준다.

    on post log in 이벤트는 gamemode에서 호출되므로 아래의 함수는 서버에서만 실행된다.

     

    이후 game state의 repNotify 함수 내부에서 아래 이벤트를 호출해주면,

     

    game state에서 player list를 replicate 하는 시점에 이벤트를 실행하게 된다.

     

    ** 주의할 점 1 : player controller를 player list로 저장하는 경우, client에서는 자기 자신의 controller 정보만 알고 있기 때문에 서버나 다른 클라이언트의 controller 정보를 얻어오지 못한다.

     

    ** 주의할 점 2 : player state를 저장해주는 경우, (다른 정보를 저장해도 동일하게 작동하는 지는 확인하지 못함.) 하나의 client에서는 위의 이벤트를 두번 호출해주는 것을 확인해 줄 수 있었다. 한번은 player list가 업데이트 되었지만(login된 플레이어 개수를 제대로 반영하고 있었음.) list 내에 요소가 unknown 값으로 인식되었고, 두번째 호출에서는 플레이어 개수와 플레이어의 player state 정보도 제대로 들어간 것을 확인할 수 있었다.

     

     

     

    아래의 코드처럼 변수 NewVar을 set 해준 경우, 처음 한 번은 값이 0에서 5로 변경함에 따라

    OnRep_NewVar 함수가 client에서도 호출되지만,

    한번 호출 된 이후에는 호출되지 않는다. 

    + event 노드의 replicate 설정을 multicast로 변경해주면 client에서도 OnRep_NewVar 함수를 호출하기는 함..

     

     

     

     

     

     

     

    변수의 replicated 항목은 아래 블로그를 살펴보자.

     

    https://m.blog.naver.com/ratoa/220996240524

     

    [Unreal Engine] Blueprint Network 요약 - 2 : 액터 및 변수 리플리케이션

    - Actor Replication -> 액터가 리플리케이트 되면 서버에서 스폰될 때 나머지 클라이언트 전부에 전...

    blog.naver.com

     

     

    set owner는 server에서만 실행 가능하며, 자동으로 클라이언트에 replicate 된다.

     

    RPC 호출

    로컬에서 호출되는 이벤트지만 다른 머신에서 원격 실행되도록 하는 이벤트를 의미한다.

    rpc 호출은 액터에서 호출해야 하며,

    replicate가 활성화되어야만 사용 가능하다.

     

     

    ** 단발성으로 호출되는 event의 경우(Run on owning Client, Multicast), reliable을 체크해주자.

     

     

     

    ** replicate와 RPC 호출에 대해 유의할 점.

    replicate 설정해준 액터 혹은 변수는 RPC 호출을 해주지 않아도 네트워크 상에서 동기화가 진행된다.

    RPC 호출을 진행해주는 경우에는 authority 체크 후, 서버 혹은 클라이언트에서만 호출되는 경우 설정해준다.

    GameMode는 서버에서만 실행되는 액터이기 때문에 RPC 호출을 활용해주는 것이 맞겠다..

     

    + GameMode는 서버에서만 소유하고 있기 때문에, (= 클라이언트에는 존재하지 않는 액터라는 의미..)

    GameMode내 에서 Multicast 이벤트를 정의해주고 그 이벤트를 실행해줄 경우 서버에서만 실행되는 결과를 확인할 수 있다.

     

     

Designed by Tistory.