inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

7강 캐릭터 스탯과 위젯

OnHpChanged 델리게이트의 broadcast 호출시점에 대한 궁금증이 있습니다.

해결된 질문

156

hush park

작성한 질문수 46

0

우선 제가 알고있는 바로는

 

  1. UABCharacterStatComponent::BeginPlay() 가 호출될 시, 내부에서 SetHp 함수가 호출되며 그 안에 있는 OnHpChanged.Broadcast(CurrentHp); 가 호출되므로, 그 전에 OnHpChanged가 바인딩되어 있어야 한다.

 

  1. UABHpBarWidget::NativeConstruct() 내부에 SetupCharacterWidget(this) 가 호출되고, 이 안에서 Stat->OnHpChanged.AddUObject를 통해 &UABHpBarWidget::UpdateHpBar 를 바인딩한다.

 ---

먼저 OnHpChanged 에 어떤 함수를 바인딩 후에 1. 처럼 Broadcast 를 하는것이 순서로 알고 있는데, 위젯의 NativeConstruct() 는 스탯컴포넌트의 BeginPlay() 보다 늦게 호출되는 것으로 알고 있어서 만약 이것이 사실이라면, 2. 의 바인딩 과정 이전에 이미 스탯컴포넌트의 BeginPlay를 통해서 바인딩되지 않은 OnHpChanged를 Broadcast를 해버리는 결과가 생길수도 있는건가요?

 

 

 

 

 

 

unreal-engine ue-blueprint 언리얼-c++

답변 2

0

이득우

네 강의 노트에서 설명을 했는데, 해당 호출 구조는 13강에서 올바로 잡힙니다.
이후 13강을 진행할 때 참고해 수정해주면 되겠습니다.

0

인프런 AI 인턴

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

질문해주신 내용은 언리얼 엔진에서의 액터 및 위젯 초기화 순서와 이벤트 바인딩에 관한 중요한 이슈입니다. 언리얼 엔진에서 액터의 컴포넌트인 UABCharacterStatComponentBeginPlay()가 호출될 때, SetHp()가 호출되어 OnHpChanged.Broadcast(CurrentHp)를 실행합니다. 여기서 중요한 점은 이벤트를 바인딩하기 전에 이미 위젯 초기화를 기다리지 못하고 브로드캐스트가 호출될 수 있다는 것입니다.

UABHpBarWidget::NativeConstruct() 함수는 위젯의 초기화 시점에서 실행되므로, 일반적으로 액터의 BeginPlay() 후에 호출됩니다. 따라서, 위젯의 이벤트 리스너가 BeginPlay()의 결과로 발생하는 초기 브로드캐스트 이벤트를 놓치는 경우가 발생할 수 있습니다.

이러한 초기화 순서 문제를 해결하기 위해 몇 가지 방법을 고려할 수 있습니다:

  1. 순서 조정: 이벤트가 발생하기 전에 바인딩이 완료되도록 초기화 순서를 조정할 수 있습니다. 아마도 액터가 특정 조건 하에 Broadcast를 호출하는 시점을 지연시키거나 위젯 초기화를 앞당기는 방법이 있을 수 있습니다.

  2. 초기 값 처리: 만약 처음 호출되는 Broadcast를 놓칠 경우를 대비해, 위젯 초기화 시점에 필요한 상태 업데이트를 즉시 처리하여 UI와 데이터를 일치시키는 로직을 추가할 수도 있습니다. 예를 들어, NativeConstruct()에서 현재 HP 상태를 직접 얻어와 UI를 업데이트하는 방법을 사용할 수 있습니다.

다른 인프런 사용자들이 유사한 주제에서 고민했던 내용을 아래 링크에서 확인하실 수 있습니다:

플레이어에만 위젯을 넣었는데 NPC에서 HpBar가 어떻게 나오나요??
- 이 링크에서는 위젯의 초기화가 왜 예상하지 않았던 시점에 발생하는지에 관한 토론을 다루고 있습니다.

많이 어려운데, 한개씩 이해하고있는 중이라,질문입니다.
- 이 질문에서는 위젯과 스탯 컴포넌트의 초기화와 바인딩을 어떻게 설정할 것인지에 대한 다양한 구현 전략을 소개하고 있습니다.

질문자님의 상황에 맞춰 본 내용을 검토하고 프로젝트에서 가장 적합한 솔루션을 적용해보세요. 그러면 더 정확하고 안정된 UI 업데이트를 기대할 수 있을 것입니다.

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

무한맵 제작과정중에 GetWorld 가 Nullptr 을 반환합니다.

0

46

2

12강 행동트리에서 질문이 있습니다.

0

52

1

위젯 사이즈랑 위치 질문드려요.

0

82

3

행동트리의 데코레이션 관련하여 질문이 있습니다.

0

94

3

VS 2026 의 문제일까요?

0

488

2

에셋참조 블루프린트질문

0

67

2

애님 몽타주 콤보 관련질문

0

70

2

ThirdPerson CDO 에러가 생깁니다.

0

95

3

캐릭터가 움직이지 않습니다.

0

182

4

쿠킹 폴더 지정시 , Item 이외에는 지정하지 않는지 궁금합니다.

0

62

2

TSoftObjectPtr 를 사용했음에도, 메모리에 로드 됩니다.

0

95

2

7강에 나오는 생성자에 대해서 궁금합니다.

0

78

2

6강을 마무리하며 트레이스 채널 을 이해하지 못했습니다.

0

73

2

3강을 마무리 하며, 카메라가 움직이지 않습니다.

0

71

2

Use Controller Rotation 옵션값이 궁금합니다.

0

84

2

3강 입력 시스템 적용 중, 5.6 버전은 입력 매팅이 2개 입니다.

0

65

2

PlayerController 에 대헤 제가 잘못 이해한 것 같습니다.

0

78

2

13강 UpdateStat 부분에서 문제를 겪고 있습니다.

0

64

2

BP_PlayerController의 CustomEvent노드 이유가 궁금합니다.

0

65

1

콤포넌트 포인터 선언시 TObjectPtr<>과 UStaticMeshComponent* 차이점

0

72

2

CharacterMovementComponent의 RotationRate관련해서 질문이 있습니다.

0

115

2

언리얼 공부방법에 대해 질문드립니다.

0

87

2

4강 에서 이상한 그림자가 남습니다.

0

46

1

2강에서 카메라 회전안되시는분 참고

2

91

2