관리 메뉴

Mini

[UE5] 적 체력바 구현 본문

UE5/Ability Tasks

[UE5] 적 체력바 구현

Mini_96 2024. 6. 18. 00:12

1. 적 > 위젯콤포넌트 달기

class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
    GENERATED_BODY()

...
    UPROPERTY(VisibleAnywhere,BlueprintReadOnly)
    TObjectPtr<UWidgetComponent> HealthBar;
HealthBar = CreateDefaultSubobject<UWidgetComponent>("HealthBar");
HealthBar->SetupAttachment(GetRootComponent());

 

사이즈박스, 달아주고
변수로 만들어주고
프로그레스바 : 틴트흰색 / 알파=0으로
함수에서 설정(틴트 흰색/ 알파=0)
FIll img 설정

 

결과

 

적 베이스에서 설정
결과 : 좀더위로 올렸으면

 

적에서 올리면됨
결과

 

* data 연결하기

이전에 속성델리게이트를 위젯컨트롤러에서 만들었음

인클루드하고, 변수를 그대로 사용할거임

- 위젯컨트롤러에 의존성이 생기면 안좋지않나? 상호의존성이 아니라 ㄱㅊ

- 리팩토링 : 해당 델리게이트를 다른 클래스에서 관리하도록 리팩토링 해도됨

 

1. 델리게이트 변수달기

class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
    GENERATED_BODY()

public:
    AAuraEnemy();

    //~Enemy Interface
    virtual void HighlightActor() override;
    virtual void UnHighlightActor() override;
    //~ End Enemy Interface

    /**Combat Interface*/
    virtual int32 GetPlayerLevel() override;

    UPROPERTY(BlueprintAssignable)
    FOnAttributeChangedSignature OnHealthChanged;
    
    UPROPERTY(BlueprintAssignable)
    FOnAttributeChangedSignature OnMaxHealthChanged;

 

2. 바인딩전 ASC 초기화된 후에 사용해야함

- 위치선정 : InitInfo 이후가 적절

캐릭베이스에 ASC, AS 있는걸 기억

- 바인딩

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();
    InitAbilityActorInfo();

    const UAuraAttributeSet* AuraAS = Cast<UAuraAttributeSet>(AttributeSet);
    if(AuraAS)
    {
       AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAS->GetHealthAttribute()).AddLambda(
          [this](const FOnAttributeChangeData& Data)
          {
             OnHealthChanged.Broadcast(Data.NewValue);
          }
       );
       AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAS->GetMaxHealthAttribute()).AddLambda(
          [this](const FOnAttributeChangeData& Data)
          {
             OnMaxHealthChanged.Broadcast(Data.NewValue);
          }
       );
    }
    
}

체력바 상속받은 위젯 만듬(적 전용)
적베이스의 체력바도 저걸로 교체

 

* then, 위젯컨트롤러는 어케설정?

적자체를 위젯컨트롤러로 설정하기로 함.

초기값방송

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();
    InitAbilityActorInfo();

    if(UAuraUserWidget* AuraUserWidget = Cast<UAuraUserWidget>(HealthBar->GetUserWidgetObject()))
    {
       AuraUserWidget->SetWidgetController(this); //적 자체를 위젯컨트롤러로 설정! (위젯컨트롤러는 obj임 == 아무거나 될수있음)
    }
    
    //위젯컨트롤러 set후 바인딩해야함
    const UAuraAttributeSet* AuraAS = Cast<UAuraAttributeSet>(AttributeSet);
    if(AuraAS)
    {
       //속성값 변경시 방송
       ...
       //초기값방송
       OnHealthChanged.Broadcast(AuraAS->GetHealth());
       OnMaxHealthChanged.Broadcast(AuraAS->GetMaxHealth());
    }
    
}

위젯컨트롤러가 set 되면 , 위젯컨트롤러를 캐스팅

 

속성변화를 구독
위에서만든 BarFront에 setPercent 하면됨 , newVal을 가지고 / set된직후에 해야함에 주의

 

결과 : 굿!

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/ae715248a6e50b6d941104cfc473191545370eb7

 

feat : 적 체력바 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@ae71524

Bisu96 committed Jun 17, 2024

github.com