인프런 커뮤니티 질문&답변

박은혁님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해

2강 게임 모드와 로그인

클라이언트 새로 생성시 크래쉬 나는 문제..

작성

·

83

0

안녕하세요. 영상을 보면서 언리얼을 배우고있는 학생입니다.
선생님께서 알려주신대로 제가 따로 만든 프로젝트에 점목을 시키고있는데 클라이언트 추가 생성시 GameMode를 상속받은 클래스에서 Login()함수에 NewPlayer의 플레이어 컨트롤러가
NULL로 들어와 크래쉬가 나 에디터가 꺼지는 현상이 일어 나고있습니다.. 어떻게 해결이 가능할까요???

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

아래처럼 상위 클래스의 Login 함수를 호출한 후 받은 플레이어 컨트롤러가 NULL값으로 들어온다고 이해하면 될까요?

APlayerController* NewPlayerController = Super::Login(NewPlayer, InRemoteRole, Portal, Options, UniqueId, ErrorMessage);

Player와 PlayerController는 다른 객체입니다.

 

박은혁님의 프로필 이미지
박은혁
질문자

디버깅을 통해 플레이어컨트롤러를 생성하는것은 확인을 했습니다. 정확히는 제가 파라곤 캐릭터로 테스트를 하고있는데 캐릭터 클래스에서
APlayerController* PlayerController = CastChecked<APlayerController>(GetController());
GetController() 함수를 통해 컨트롤러를 가지고 오는데 클라이언트를 하나 생성시 저 부분에서 nullptr이 떨어져 크래쉬가 나고 있었습니다.
또한,

image.png

영상과 다르게 처음 Standalone이 아닌 서버로 뜨고 있는 상황이 있습니다.. 버전이 다른데 버전의 차이때문일까요??

이득우님의 프로필 이미지
이득우
지식공유자

Standalone과 Server의 차이는 버전 때문인 것으로 보여집니다. ( 5.1 이후 버전에서 시스템에서 세팅하는 타이밍이 조금 달라졌습니다. )
GetController() 함수가 nullptr이 나왔다는 것은 아직 빙의가 안된 타이밍에 호출한 것으로 보여지는데, 언제 호출하는지 코드를 볼 수 있을까요?

박은혁님의 프로필 이미지
박은혁
질문자

ACharacter()를 상속받은 캐릭터 클래스의 BeginPlay()함수에서 호출을 하고있습니다.

이득우님의 프로필 이미지
이득우
지식공유자

HasAuthority 함수를 사용해 서버와 클라이언트를 비교해 확인해보시겠어요?

박은혁님의 프로필 이미지
박은혁
질문자

image.png

처음 한번 에디터 서버 실행시에는 GetController()를 통해 컨트롤러가 잘들어옵니다.
다음 클라이언트를 하나 추가시

image.png

이렇게 들어오고 있는 상황입니다.

이득우님의 프로필 이미지
이득우
지식공유자

네 지금 두 명의 캐릭터가 있는데 ( 서버와 클라 ) , 서버 입장에서는 모든 클라의 컨트롤러를 소유하고 있지만, 클라 입장에서는 서버 컴퓨터의 Player는 자기 소유가 아닌 상황입니다.

로그를 보면 첫 번째 캐릭터는 자기가 소유하는 캐릭터라 GetController가 함수 결과가 반환되는데, 서버의 캐릭터로 추정되는 두 번째 캐릭터는 프록시 형태로 복제된 상황이다보니 클라입장에서는 컨트롤러를 알 수 없어 nullptr이 나올 수 밖에 없는 상황입니다.

그렇기에 IsLocallyControlled함수를 사용해 내가 조종할 수 있는 캐릭터인지 먼저 확인을 하고 로직을 진행하셔야 합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

박은혁님이 겪고 있는 문제는 언리얼 엔진에서 멀티플레이어 게임을 개발할 때 흔히 발생할 수 있는 문제 중 하나입니다. 클라이언트 생성 시 크래쉬가 나는 현상은 여러 가지 원인에 의해 발생할 수 있습니다. 특히, Login() 함수에서 NewPlayer의 플레이어 컨트롤러가 NULL로 들어오는 경우는 초기화 문제일 가능성이 큽니다.

이 문제를 해결하기 위해 몇 가지 해결 방법을 제안드립니다:

  1. 플레이어 컨트롤러 초기화 확인: Login() 함수가 호출되기 전에 NewPlayer가 제대로 초기화되었는지 확인하세요. GameMode의 기본 설정이나 플레이어 컨트롤러 클래스가 잘못 설정되어 있을 수 있습니다.

  2. 디버깅: Login() 함수가 호출되기 직전에 디버그 로그를 추가하여 NewPlayer가 올바르게 생성되고 있는지 확인하는 것도 중요합니다. 디버깅을 통해 어떤 시점에서 NULL이 전달되는지 추적할 수 있습니다.

  3. 프로젝트 설정 확인: 프로젝트 설정에서 GameMode와 관련된 설정이 올바른지 확인하세요. 특히, ‘플레이어 컨트롤러 클래스’가 잘못 설정되어 있으면 예상치 못한 센서리오에서 오류가 발생할 수 있습니다.

  4. 최신 엔진 사용 환경: 사용하고 계신 언리얼 엔진의 버전이 강의와 동일한지 혹은 호환 가능한 버전인지 확인해 보세요. 엔진의 버전 차이가 코드 동작 방식에 영향을 미칠 수 있습니다.

이 외에도 아래의 유사한 질문과 답변을 참고하여 문제 해결의 실마리를 찾을 수 있을 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.