[UE5] 이득우 Part 2. 7강 캐릭터 스탯과 위젯
액터 컴포넌트를 활용한 스탯의 설계
- 액터에 부착할 수 있는 컴포넌트 중 트랜스폼이 없는 컴포넌트
- 액터의 기능을 확장할 때 컴포넌트로 분리해 모듈화할 수 있음
- 스탯 데이터를 담당하는 컴포넌트와 UI 위젯을 담당하는 컴포넌트로 분리
- 액터는 두 컴포넌트가 서로 통신하도록 중개하는 역할로 지정
언리얼 델리게이트를 활용한 발행 구독 모델 구현
- 푸시(Push) 형태의 알림(Notification)을 구현하는데 적합한 디자인 패턴
- 스탯이 변경되면 델리게이트에 연결된 컴포넌트에 알림을 보내 데이터를 갱신
- 스탯 컴포넌트와 UI 컴포넌트 사이의 느슨한 결합의 생성
실습
- 액터 컴포넌트 상속 받은 stat 컴포넌트 생성
- 유저 인터페이스에서 위젯 블루프린트 생성
- 패널에서 Vertical Box
- 자식으로 Progress Bar
- 유저 위젯을 상속받은 클래스 생성
- 블루프린트에서 그래프에서 클래스 세팅을 유저 위젯에서 새로 만들 클래스로 변경
- stat 구현
- UPROPERTY에서 VisibleInstanceOnly를 설정하면 배치된 캐릭터들마다 각각 다른 값을 설정 가능
- 스탯 컴포넌트를 저장할 때 속성들이 모두 디스크에 저장되지만 매번 변하는 값은 저장할 필요가 없음
-> UPROPERTY에서 Transient 키워드 추가
- 델리게이트 선언
- Hp가 변경될 때나 죽었을 때 Broadcast
- hp bar 위젯 구현
- 유저 위젯은 const FObjectInitializer& ObjectInitializer 라는 인자를 하나 가진 생성자만 지원
- Progress Bar 헤더는 UMG 모듈에서 제공
-> 빌드 설정에 UMG 모듈 추가
- NativeConstruct를 오버라이드
- 이 함수가 호출될 때는 UI 관련 모든 기능들이 거의 초기화 완료
- 캐릭터에 부착
- 위젯 자체로는 부착할 수 없음
-> 위젯 컴포넌트를 이용해서 부착
액터의 라이프 사이클
- 액터 초기화 두 가지
- 디스크에 저장된 레벨 정보가 로딩되면서 초기화
- 스크립트를 사용해 런타입에서 생성하는 스폰
- 둘 다 거의 마지막 단계에서는 PostInitializedComponents가 호출
- 이후에 BeginPlay 호출
-> 이 때부터 Tick 발동
위젯 컴포넌트와 위젯
- 위젯 컴포넌트 : 액터 위에 UI 위젯을 띄우는 컴포넌트
- 3차원, 2차원 모드 지원
- 컨테이너 역할만 함, 둘은 서로 독립적으로 동작
위젯 컴포넌트의 초기화 과정
- 발행 구독 모델의 구현을 위해 위젯 컴포넌트의 초기화 단계를 파악할 필요가 있음
- 스탯 컴포넌트의 데이터가 업데이트 될 때 자동으로 위젯이 갱신되도록 기능을 구현해야 함
-> 스탯 컴포넌트의 존재를 위젯이 알아야 함
- UI 관련 컴포넌트는 액터의 BeginPlay 이후에 호출 됨
- 생성시 InitWidget 함수와 NativeConstruct 함수를 호출
- 유저 위젯과 스탯 컴포넌트를 연결시킬 타이밍 필요
- 유저 위젯의 경우 등록하기 위해서 액터에 속한 stat 컴포넌트의 존재를 가져와야 하는데
-> 자신을 소유하고 있는 위젯 컴포넌트로부터 액터 정보를 얻어올 방법이 없음
-> 컴포넌트와 유저 위젯을 확장해 해당 정보를 받아옴
- 차후에 변경될 가능성도 염두
위젯 컴포넌트와 위젯의 확장
- 위젯에 소유한 액터 정보를 보관할 수 있도록 클래스를 확장
- 위젯 컴포넌트 초기화 단계에서 이를 설정할 수 있도록 클래스를 확장
- 위젯 초기화 단계에서 부모 클래스 정보를 읽고 자신을 등록
실습
- 새로운 위젯 컴포넌트와 유저 위젯 클래스를 생성
- 유저 위젯은 OwningActor 보유 외의 다른 기능 없음
- 위젯 컴포넌트 InitWidget이 있는데 Super에서 인스턴스가 이 때 만들어짐
- 인터페이스 클래스 생성
- 위젯 셋업 함수
- 위젯을 셋업하고
- 스텟과 델리게이트로 연동되게 함