블루프린트에서 변수 리플리케이트

블루프린트에서 Replicated 및 RepNotify 변수 사용법 안내입니다.

Windows
MacOS
Linux

네트워크를 통해 액터함수 를 리플리케이트시킬 수 있는 것처럼, 변수 도 마찬가지입니다. 게임플레이에 중요한 변수는 네트워크 오소리티 (서버) 에서만 변경 가능하며, 그 후 원격 머신 (클라이언트) 에 알 필요가 있는지에 따라 리플리케이트 시킵니다. 클라이언트에서는 변수를 변경하지 않도록 하는 것이 좋은데, (생명력, 탄약, 경험치 값 등의) 치팅이 가능하기 때문입니다.

변수에 Replicated 설정을 하면, 그 변수는 서버에서 클라이언트로 리플리케이트되는 변수의 1:1 사본을 만든다는 뜻입니다. 또는 RepNotify 를 사용하면, Replicated 의 역할에 추가로 붙어있는 변수가 업데이트될 때마다 서버와 클라이언트 머신 양쪽에서 실행되는 함수가 제공되기도 합니다.

여기서는 Replicated 변수와 RepNotify 변수 둘 다에 대한 샘플 용례를 약간 다룹니다.

Replicated

이 예제에서는 시작용 콘텐츠 포함블루프린트 3인칭 템플릿 을 사용합니다.

이 예제에서는 서버와 클라이언트 양쪽에서 볼 수 있는 카운트다운 타이머에 사용되는 Replicated 변수를 만들어 보겠습니다.

  1. Content/StarterContent/Blueprints 폴더에서 Blueprint_Effect_Fire 블루프린트를 엽니다.

  2. 클래스 디폴트 를 선택한 채 디테일 패널에서 Replication 아래 Replicates 옵션을 체크합니다.

    HT_0.png

    그러면 이 블루프린트가 망을 통해 연결된 모든 머신에 리플리케이트됩니다.

  3. 컴포넌트 창에서, 컴포넌트 추가 버튼을 클릭한 다음 Text Render 컴포넌트를 검색 추가합니다.

    HT_1.png

  4. 뷰포트 탭에서 텍스트가 더욱 잘 보이도록 불 위쪽으로 위치를 옮깁니다.

    HT_2.png

  5. 이벤트 그래프 탭을 클릭하고, 그래프 안에 우클릭 한 다음 Event Begin Play 노드를 추가합니다.

  6. Event Begin Play 를 끌어놓은 다음 Switch Has Authority 노드를 검색 추가합니다.

  7. Authority 핀을 끌어놓은 다음 Set Timer 노드를 추가하고 Time1, Looping 은 체크합니다.

    HT_3.png

    여기서 Switch Has Authority 노드를 사용하여 이 블루프린트 스폰시 오소리티(서버)에서만 Set Timer 함수를 호출하도록 합니다. 이 스크립트가 게임에 중요한 데이터를 처리하는 경우, 서버에서만 실행하도록 한 다음 클라이언트에 그 데이터를 리플리케이트 시키는 것이, 클라이언트에서 직접 실행하도록 하는 것보다 치트 방지에 좋습니다.

  8. 내 블루프린트 창에서 변수를 새로 만들어 CountDownTimer 라 합니다.

  9. 변수의 디테일 패널에서 Integer 유형으로 변경합니다. 컴파일 하고 Default Value 값을 10 으로 설정합니다.

    HT_4.png

  10. 그래프에 우클릭 한 다음 Custom Event 를 새로 만들어 Update Timer 라 합니다.

  11. Update TimerBranch (분기) 노드에 연결한 다음, True 핀을 끌어놓고 Set CountDownTimer 노드를 추가합니다.

  12. 그래프에 우클릭 한 다음 Get CountDownTimer 노드를 추가하고, 거기서 끌어놓은 다음 Int - Int 노드를 사용하여 박스에 1 을 입력합니다.

  13. CountDownTimer 노드를 다시 끌어놓은 다음 Int > Int 노드를 사용하여 아래와 같이 노드 연결을 합니다.

    HT_5.png

    여기서 UpdateTimer 가 호출될 때마다 CountDownTimer 가 0 보다 클 경우에만 1 을 빼라고 합니다.

  14. Set Timer 노드에서 Function Name 아래 커스텀 이벤트의 이름을 (UpdateTimer) 추가합니다.

    HT_6.png

    이렇게 하면 타이머에게 멈추라고 할 때까지 1 초마다 UpdateTimer 이벤트를 호출합니다.

  15. 그래프에 우클릭 한 다음 Event Tick 노드를 추가합니다.

  16. Ctrl 키를 누르고 내 블루프린트 창에서 TextRender1 컴포넌트를 끌어놓은 다음, 거기서 다시 끌어놓고 Set Text 노드를 사용합니다.

  17. Ctrl 키를 누르고 CountDownTimer 변수를 끌어놓은 다음 Set Text 노드의 Value 에 연결합니다.

    HT_7.png

    변환 노드가 자동으로 생성되며, 여기서는 텍스트를 카운트다운 타이머 값으로 설정하고 있습니다.

  18. 컴파일, 저장 후 블루프린트를 닫습니다.

  19. 콘텐츠 브라우저 에서 Blueprint_Effect_Fire 를 끌어 레벨에 놓습니다.

    HT_9.png

  20. 메인 툴바에서 플레이 버튼 옆의 아래 화살표를 클릭하고, 플레이어 수 를 2 로 설정합니다.

    NoOfPlayers.png

  21. 플레이 버튼을 눌러 에디터에서 플레이합니다.

    HT_11.png

    에디터에서 플레이하면, 서버 에서는 0 까지 카운트 다운 되는데 클라이언트 에서는 되지 않는 것이 보입니다.

  22. Blueprint_Effect_Fire 블루프린트로 돌아옵니다.

  23. CountDownTimer 변수의 디테일 패널에서 Replication 옵션을 Replicated 로 변경합니다.

    HT_12.png

    그러면 연결된 머신에 이 프로퍼티를 리플리케이트시킬 수 있습니다.

  24. 그래프가 업데이트되고, CountDownTimer 변수 인스턴스 각각에도 리플리케이트 아이콘이 나타납니다.

    HT_13.png

  25. 컴파일, 저장 후 블루프린트를 닫고 에디터에서 플레이합니다.

    HT_14.png

    이제 서버와 클라이언트 양쪽에서 10 부터의 텍스트 카운트 다운이 제대로 표시되는 것이 보일 것입니다. 정수를 사용해서 텍스트 렌더 업데이트를 하기는 했지만, 이런 식으로 캐릭터의 생명력, 탄환, 기타 게임플레이 관련 변수를 나타내는 데도 쉽게 사용할 수 있습니다.

RepNotify

이 예제는 위에 제공된 Replicated 예제에서 이어집니다.

위에 제공된 Replicated 예제에서는 서버와 클라이언트 양쪽에 표시되는 카운트다운 타이머를 만들었습니다. 이 예제에서는 RepNotify 변수를 사용하여 카운트다운 타이머가 0 에 도달하면 서버와 클라이언트 양쪽에서 화염 이펙트를 비활성화시키도록 하겠습니다.

  1. Blueprint_Effect_Fire 블루프린트를 엽니다.

  2. 내 블루프린트 창에서 Ctrl 키를 누르고 P_Fire 이펙트를 끌어놓은 다음, 거기서 Deactivate 노드를 사용합니다.

  3. UpdateTimer 에 연결된 Branch (분기) 의 False 핀을 끌어 아래와 같이 Deactivate 노드에 연결합니다.

    HT_15.png

    여기서는 UpdateTimer 가 호출되면 CountDownTimer 에서 (0 보다 큰 경우) 1 을 빼도록 합니다. 0 보다 크지 않으면, P_Fire 파티클 이펙트를 Deactivate 비활성화 시킵니다.

  4. 컴파일, 저장 후 블루프린트를 닫고 에디터에서 플레이합니다.

    HT_16.png

    에디터에서 플레이해 보면, 0 에 도달할 때 서버에서만 화염 이펙트가 비활성화되는 것이 보일 것입니다.

  5. Blueprint_Effect_Fire 블루프린트로 돌아와서 Boolean 유형 변수를 새로 만들어 Deactivate 라 해 줍니다.

  6. Deactivate 변수에서 Replication 유형이 RepNotify 으로 설정되었는지 확인합니다.

    HT_17.png

  7. 변수를 RepNotify 로 설정하고 나면 새로운 함수가 자동으로 생성된 것을 볼 수 있습니다.

    HT_18.png

    이 함수는 RepNotify 로 설정한 변수가 변할 때마다 호출되며, 서버와 클라이언트 양쪽에서 실행될 것입니다.

  8. 더블클릭 on the On Rep Deactivate Function to open it up.

  9. Ctrl 키를 누르고 P_Fire 컴포넌트를 끌어놓은 다음, 거기서 Deactivate 노드를 추가합니다.

    HT_19.png

  10. 이벤트 그래프 로 돌아와 UpdateTimer 이벤트를 찾습니다.

  11. Branch (분기)의 False 를 끌어놓고 Set Deactivate 노드를 추가한 다음 True 로 설정합니다.

    HT_20.png

    변수가 알림 함수도 호출됨을 나타내는 Set w/Notify 라고도 되어 있는 것을 볼 수 있습니다.

  12. 컴파일, 저장 후 블루프린트를 닫고 에디터에서 플레이합니다.

    HT_21.png

    에디터에서 플레이해 보면 이번에는, 타이머가 0 이 되면 서버와 클라이언트 양쪽에서 화염 이펙트가 꺼지는 것이 보일 것입니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼