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

차태관님의 프로필 이미지

작성한 질문수

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

리슨 서버 시 위젯 부착 관련

24.05.24 13:51 작성

·

119

0

//CharacterBase.h

if (!IsLocallyControlled())
{
	UE_LOG(LogTemp, Log, TEXT("LocallyControlled"));

	InfoBar = CreateDefaultSubobject<UWidgetComponent>(TEXT("Widget"));
	InfoBar->SetupAttachment(GetMesh());
	InfoBar->SetRelativeLocation(FVector(0.0f, 0.0f, 210.0f));

	static ConstructorHelpers::FClassFinder<UUserWidget> InfoBarWidgetRef(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/ProjectA/Blueprints/UI/WBP_InfoBar.WBP_InfoBar_C'"));
	if (InfoBarWidgetRef.Class)
	{
		InfoBar->SetWidgetClass(InfoBarWidgetRef.Class);
		InfoBar->SetWidgetSpace(EWidgetSpace::Screen);
		InfoBar->SetDrawSize(FVector2D(300.0f, 75.0f));
		InfoBar->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}

}

안녕하세요 교수님, 리슨 서버로 동작 시킬 때 제가 만든 InfoBar 를 로컬의 캐릭터에는 부착하지 않고 로컬이 바라보는 프록시들에게만 부착을 하고 싶습니다. 그래서 제 생각에는 로컬로 컨트롤 되고 있다면 위젯을 생성하지 않는 방식으로 해결을 하려 했는데, 그럼에도 InfoBar 가 생성되어 부착됩니다.

어떻게 하면 제가 의도한 대로 로컬에서는 프록시의 InfoBar 만 보이게 설계 할 수 있을까요?

답변 1

0

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

2024. 05. 24. 15:01

음 보내주신 코드는 생성자 코드로 보여지는데, 파트1 강의에서 설명드렸지만 생성자 코드는 엔진이 초기화될 때 실행됩니다. 따라서 이 때 IsLocallyControlled 함수의 사용은 큰 의미가 없습니다.

해당 함수는 멀티플레이 설정이 완료된 이후의 런타임에서 실행해주시는 것이 좋습니다.
가장 간단히 생각하면 BeginPlay가 있겠지요.
런타임에서는 IsLocallyControlled 함수를 실행하고 부착된 위젯을 비활성화하는 형태로 옵션을 지정하면 되지 않을까 싶습니다

차태관님의 프로필 이미지
차태관
질문자

2024. 05. 24. 16:37

우선 공통적으로 atach 해 준 후 beginplay에서 destroycomponent 하니 잘 동작합니다
! 감사합니다 !