[UE5] 이득우 Part 2. 7강 캐릭터 스탯과 위젯

공부 스파이럴·2024년 1월 25일
0

액터 컴포넌트를 활용한 스탯의 설계

  • 액터에 부착할 수 있는 컴포넌트 중 트랜스폼이 없는 컴포넌트
  • 액터의 기능을 확장할 때 컴포넌트로 분리해 모듈화할 수 있음
  • 스탯 데이터를 담당하는 컴포넌트와 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 관련 모든 기능들이 거의 초기화 완료

  • 캐릭터에 부착
    • 위젯 자체로는 부착할 수 없음
      -> 위젯 컴포넌트를 이용해서 부착

액터의 라이프 사이클

  • 액터 초기화 두 가지
    1. 디스크에 저장된 레벨 정보가 로딩되면서 초기화
    2. 스크립트를 사용해 런타입에서 생성하는 스폰
  • 둘 다 거의 마지막 단계에서는 PostInitializedComponents가 호출
    • 이후에 BeginPlay 호출
      -> 이 때부터 Tick 발동

위젯 컴포넌트와 위젯

  • 위젯 컴포넌트 : 액터 위에 UI 위젯을 띄우는 컴포넌트
    • 3차원, 2차원 모드 지원
    • 컨테이너 역할만 함, 둘은 서로 독립적으로 동작

위젯 컴포넌트의 초기화 과정

  • 발행 구독 모델의 구현을 위해 위젯 컴포넌트의 초기화 단계를 파악할 필요가 있음
    • 스탯 컴포넌트의 데이터가 업데이트 될 때 자동으로 위젯이 갱신되도록 기능을 구현해야 함
      -> 스탯 컴포넌트의 존재를 위젯이 알아야 함
  • UI 관련 컴포넌트는 액터의 BeginPlay 이후에 호출 됨
  • 생성시 InitWidget 함수와 NativeConstruct 함수를 호출
    • 유저 위젯과 스탯 컴포넌트를 연결시킬 타이밍 필요
    • 유저 위젯의 경우 등록하기 위해서 액터에 속한 stat 컴포넌트의 존재를 가져와야 하는데
      -> 자신을 소유하고 있는 위젯 컴포넌트로부터 액터 정보를 얻어올 방법이 없음
      -> 컴포넌트와 유저 위젯을 확장해 해당 정보를 받아옴
  • 차후에 변경될 가능성도 염두

위젯 컴포넌트와 위젯의 확장

  • 위젯에 소유한 액터 정보를 보관할 수 있도록 클래스를 확장
  • 위젯 컴포넌트 초기화 단계에서 이를 설정할 수 있도록 클래스를 확장
  • 위젯 초기화 단계에서 부모 클래스 정보를 읽고 자신을 등록
    • SetupCharacterWidget 호출

실습

  • 새로운 위젯 컴포넌트와 유저 위젯 클래스를 생성
    • 유저 위젯은 OwningActor 보유 외의 다른 기능 없음
    • 위젯 컴포넌트 InitWidget이 있는데 Super에서 인스턴스가 이 때 만들어짐
  • 인터페이스 클래스 생성
    • 위젯 셋업 함수
      • 위젯을 셋업하고
      • 스텟과 델리게이트로 연동되게 함

0개의 댓글