언리얼 엔진 본캠프 14주차-5 언리얼 C++ : 야구 게임 - 트러블 슈팅1

정재훈·2025년 3월 21일
0

unreal engine

목록 보기
31/45

트러블 슈팅

UPROPERTY() 에러

  • UPROPERTY()에 BlueprintReadWrite 지정자를 사용하면, 해당 멤버 변수의 접근 지정자를 private을 하면 안됨. public이나 protected로 바꾸면 에러 없어짐

UI AddToViewport() 경고

UI는 클라이언트에만 있으니까 PlayerController에서 채팅UI를 추가하려고 아래와 같은 코드를 추가했음

근데 실행해보니 잘 나오긴 했는데

PIE를 종료할 때 아래와 같은 메시지 로그가 나옴

메시지를 읽어보면 "오직 Local PlayerController만 위젯을 할당할 수 있다"라고 되어 있어 아래 코드를 SetupHUD()에 추가

코드를 추가하니 에러 메시지 로그창이 안 뜨게 되었음

여기서 하나 의문이 든 게, "서버에서는 SetupHUD()를 바로 넘어가도록 했는데, 왜 게임 창에는 UI가 붙어 있는 거지?" 였다

위 gif 파일을 보면 서버 창에 UI가 먼저 붙고, 그 다음에 클라이언트 창에 UI가 붙는 걸 볼 수 있는데, 좀 더 비교해보기 쉽게 NetMode를 로그에 출력하도록 하는 코드를 추가하고

로그를 출력해보니

  • 처음 서버를 skip 하는지 안하는지를 로그로 찍어볼 때는 로그를 위에까지 보지 않았는데, 위까지 찾아보니 로그가 하나 더 찍혀있었음

로그를 보면 서버(NetMode:2)에서 Skip Server 1번 SetupHUD() Client 1번, 총 2번 호출 되었고, 클라이언트(NetMode:3)에서는 SetupHUD() Client 1번, 총 1번 호출되었음

  • Listen Server에서 서버는 서버의 역할도 하고, 클라이언트의 역할도 함
    • => SetupHUD()가 총 2번 호출됨
    • => 그 중 서버 역할일 때 Skip Server되고, 클라이언트 역할일 때 SetupHUD() Client

이게 아님 실제로는

  • 언리얼 문서 참고
  • 유튜브 참고
  • 플레이어 수 4명으로 하고, listen server로 PIE 돌리면
    • 이와 같은 로그를 볼 수 있음.
    • 실제로 중간 흰 공백 만큼 어떤 로그들이 있음
      1. 처음에는 그냥 서버만 만들어지고
      2. 그 다음 클라이언트1이 접속하면, 서버에서 PC를 만들어서 클라이언트에게 넘겨줌. 이 때 두 PC의 BeginPlay()가 호출되면서 서버 측 PC는 Skip이 되고 클라이언트 측 PC는 SetupHUD를 함
      3. 클라이언트 2, 3이 접속할 때도 마찬가지

이렇게 되면 1. 왜 서버 창에 UI가 뜨고, 2. 왜 서버에서 controller가 Skip되는 지를 이해할 수 있다

  1. Listen server는 서버의 Local PlayerController로 UI를 추가할 수 있음
  2. 새로운 클라이언트가 접속할 때, 서버 측에서 만든 PlayerController는 Local이 아니기 때문에 Skip됨

RPC

C++로 RPC를 사용하려면

.h 파일
UFUNCTION(Client)
void Client_RPC()

UFUCTION(Server)
void Server_RPC()

UFUCTION(NetMulticast)
void Multicast_RPC()
.cpp 파일
void Client_RPC_Implementation(){}

void Server_RPC_Implementation(){}

// Server RPC UFUNCTION() 매크로에 WithValidation 지정자를 사용하면
// _Validate() 함수도 구현해야함
void Server_RPC_Validate(){}

void Multicast_RPC_Implementation(){}

위와 같이 선언과 구현을 해야함

만약 .cpp 파일에서 _Implementation을 빼고 Server_RPC()나 Client_RPC() 형태로 구현을 하면

위와 같은 링크 에러들이 발생함

  • 선언
  • 구현
  • 호출
    • 호출은 선언한 이름 그대로 사용하면 됨

위젯 동적 생성

UUserWidgetUWidget은 다름

UWidget은 위젯 블루프린트를 만들 때 팔레트에서 보이는 Canval Panel이나 Text, Button 같은 단일 위젯을 말하고, UUserWidget은 이 Uwidget을 사용해서 만든 UI 위젯을 말한다

  • UUserWidget 동적 생성
  • UWidget 동적 생성
  • UWidget 동적 할당










예상

유튜브 참고
유튜브 영상에 Is Locally Controlled 설명할 때

1인
server hello 클라(서버)

2인
server hello 클라(1)
client1 hello 클라(1)
client1 hello 클라(서버)

3인
server hello 클라(2)
client1 hello 클라(2)
client2 hello 클라(2)
client2 hello 클라(서버)
client2 hello 클라(1)

이런 식인거 같음



참조 사이트
-- Login
1. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/client-server-model?application_version=4.27
2.https://chacha-nyang.tistory.com/entry/UE-%EA%B2%8C%EC%9E%84-%EB%AA%A8%EB%93%9C%EC%99%80-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%94%8C%EB%A1%9C%EC%9A%B0%EC%9D%98-%EC%9D%B4%ED%95%B4
-- RPC
1. https://velog.io/@mino0215/%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-RPC-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8B%A4%EA%B0%80-%EC%9E%91%EC%84%B1%EC%A4%91
2. https://redchiken.tistory.com/389
-- Role
1. https://redchiken.tistory.com/387
2. https://sanghoon23.tistory.com/113
3. https://iiii4.tistory.com/146 // dedicated server
4. https://blog.naver.com/songg90/221465215055 // listen server
-- UI
1. https://forums.unrealengine.com/t/widget-vs-userwidget/450656
2. https://koreanfoodie.me/1215
3. https://cru6548.tistory.com/44

profile
드가자

0개의 댓글