Unreal Engine
Unreal Engine - Standalone을 리슨 서버로 확장하기
gbleem
2025. 3. 24. 23:43
1. Standalone 게임
아주 간단한 게임 로직을 하나 구성했다.
Goal 이라는 액터가 존재하고, 해당 액터에 플레이어가 닿으면 UserName과 WIN! 이라는 문구를 띄워주는 게임이다.
로직 설명
- GameMode에서 Goal Actor를 하나 Spawn 해준다.
- Goal 이라는 Actor에 Character가 overlap된 순간 PlayerController의 EndGame이라는 Event call해준다.
- GameMode의 EndGame 함수는 PlayerController를 찾아서 PlayerController의 EndGame 이벤트를 call한다.
- PlayerController에서는 Widget을 만들어주고 Widget의 EndGame 함수를 call해준다. 이후 add to viewport 해준다.
- Widget의 EndGame함수는 아래와 같이 TextBlock의 값을 setting 해주는 로직을 가진다.
2. 리슨 서버로 확장
2 -1. 액터 리플리케이트
위에 처럼 구성한 후 플레이 방식을 리슨 서버로 바꾸고 실행하면 아래와 같은 모습을 볼 수 있다.
Client에서 Goal Actor가 보이지 않는 이유는 액터가 Replicate되어 있지 않기 때문이다.
Replicate 되도록 수정하면
아래와 같이 서버와 클라이언트 모두에서 보인다
2 - 2. UI 연동
이대로 실행하게 되면, UI는 항상 Server 역할을 하는 쪽에서만 출력되게 된다.
해결하기 위해서 아래 사진처럼
- UI를 출력해주는 부분인 PlayerController의 EndGame 함수를 "소유중인 클라이언트에서 실행" 으로 수정해주고
- 신뢰성을 체크해주면 된다.
추가) HOST와 GUEST의 이름을 출력하기
- 먼저 Level BP에서 이름을 세팅하는 함수를 call 해준다.
- Set User Name 함수는 "서버에서 실행"으로 세팅해주면 된다.
로직 정리)
- 레벨 BP에서 SetUserName 이벤트("서버에서 실행") 을 통해 PlayerController의 UserName이라는 변수를 setting 한다.
- 이후 Goal 이라는 Actor와 Player가 Overlap된 순간
- GameMode의 EndGame 이벤트를 실행하면서
- PlayerController의 UserName 변수를 파라메터로 넣어준다.
- GameMode의 EndGame 이벤트 ("replicate 되어있지 않음") 는 모든 PlayerController를 돌면서 각 PlayerController의 EndGame 이벤트(PlayerController의 이벤트, "소유중인 클라에서 실행")를 call한다.
- PlayerController의 EndGame 이벤트는 위젯을 create하고 Widget의 EndGame 이벤트("replicate 되어 있지 않음")를 call한 후, widget을 add to viewport 해준다.
동작 모습)
3. 궁금증
- "서버에서 실행"과 "소유 중인 클라이언트에서 실행"과 같은 리플리케이트 속성은 어떻게 지정해야 하는지와 각각 지정한 경우 어떤 식으로 값들이 세팅되는지
- 레벨 BP의 서버와 클라에서의 동작 방식
- 디버깅을 해보니
- 서버의 Controller0 은 HOST로
- 서버의 Controller1은 GUEST로 초기화되어있고
- 클라의 Controller0은 비어있다.
- 디버깅을 해보니
- 아래 사진의 부분에서 서버나 클라이언트 어떤 쪽의 값을 가져오는 것인지
- 클라이언트의 값을 가져와야 하는것 아닌가?
- 근데 클라의 Controller UserName은 비어있다...
4. 팁
third person bp에서 아래와 같은 오류가 발생하면
Third Person BP의 IMC 세팅하는 부분에서 Is Locally Controlled 함수로 valid 체크를 한번 해주면 해결된다.