관리 메뉴

Mini

[UE5] 적 죽을때 용해효과 구현 본문

UE5/Damage

[UE5] 적 죽을때 용해효과 구현

Mini_96 2024. 6. 23. 17:23

* 설계

녹는 머테리얼을 가지고있음
현재 기본머테리얼로 설정되어있음
고블린SKM 선택후, 우측하단 누르면 적용미리보기가능 / Dissolve 값에따라 녹는걸 확인

결론 : c++에서 죽을때, 머테리얼을 바꾸고, Dissiolve 값을 스무스하게 바꿔주면 된다.

 

* 구현 

UCLASS(Abstract) //추상클래스임 
class AURA_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface, public ICombatInterface
{
    ...
    /* 용해 Effect*/
    
    void Dissolve(); //머테리얼을 교체하는 함수

    UFUNCTION(BlueprintImplementableEvent) //타임라인설정하는 함수, BP에서 구현
    void StartDissolveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);
    
    UPROPERTY(EditAnywhere,BlueprintReadOnly)
    TObjectPtr<UMaterialInstance> DissolveMaterialInstance; //매쉬용 머테리얼

    UPROPERTY(EditAnywhere,BlueprintReadOnly)
    TObjectPtr<UMaterialInstance> WeaponDissolveMaterialInstance; //무기용 머테리얼
void AAuraCharacterBase::Dissolve()
{
    if(IsValid(DissolveMaterialInstance))
    {
       //새로운 머테리얼만들고
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);
       GetMesh()->SetMaterial(0,DynamicMatInst); //설정
       StartDissolveTimeLine(DynamicMatInst);
    }
    if(IsValid(WeaponDissolveMaterialInstance))
    {
       //새로운 머테리얼만들고
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(WeaponDissolveMaterialInstance, this);
       Weapon->SetMaterial(0,DynamicMatInst); //설정
       StartDissolveTimeLine(DynamicMatInst);
    }
}

- 데스함수에서 용해효과 호출

void AAuraCharacterBase::MulticastHandleDeath_Implementation()
{
    ...

    //용해효과 실행
    Dissolve();
}

 

*  타임라인  => Dissolve 값 바꾸기

0에서 0.5가 되면 녹는걸 확인
모든적이 녹도록 적베이스에서 구현하고자 함
타임라인 만들기(0초에 -0.1 ~ 3초에 0.5)
노드연결, 위에서만들 트랙이름 넣기

- 변수로만든 머테리얼에 의존성 주입

UPROPERTY(EditAnywhere,BlueprintReadOnly)
TObjectPtr<UMaterialInstance> DissolveMaterialInstance; //녹을때 매쉬용 머테리얼

UPROPERTY(EditAnywhere,BlueprintReadOnly)
TObjectPtr<UMaterialInstance> WeaponDissolveMaterialInstance; //녹을때 무기용 머테리얼

새총 각각 설정
문제 : 매쉬(고블린)는 용해가 안됨

 

- 원인 : 타임라인 공유가 안됨

- 해결 : 무기용 으로 하나 만들고 각각실행 해야함

UFUNCTION(BlueprintImplementableEvent) //타임라인설정하는 함수, BP에서 구현
void StartDissolveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);

UFUNCTION(BlueprintImplementableEvent) //타임라인설정하는 함수, BP에서 구현
void StartWeaponDissolveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);
void AAuraCharacterBase::Dissolve()
{
    if(IsValid(DissolveMaterialInstance))
    {
       //새로운 머테리얼만들고
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);
       GetMesh()->SetMaterial(0,DynamicMatInst); //설정
       StartDissolveTimeLine(DynamicMatInst);
    }
    if(IsValid(WeaponDissolveMaterialInstance))
    {
       //새로운 머테리얼만들고
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(WeaponDissolveMaterialInstance, this);
       Weapon->SetMaterial(0,DynamicMatInst); //설정
       StartWeaponDissolveTimeLine(DynamicMatInst);
    }
}

 

타임라인만들어주시고
노드 베껴서 구현해주시고
결과 : 매쉬, 무기 둘다 잘녹음

 

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

 

feat : 적 죽을때 용해효과 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@e6b0795

Bisu96 committed Jun 23, 2024

github.com