본문 바로가기

게임프로그래밍/실습2

[실습2] 50. 에너미가 죽을때 디졸브 적용하기

1. 디졸브 머티리얼 생성하기

 

다이나믹 인스턴스 머테리얼을 통해 런타임 중 머테리얼을 바꿀 것이다. 이를 통해 매시를 디졸브 매시로 바꾸어 에너미가 죽을때 디졸브 기능을 구현할 수 있다.

 

캐릭터 베이스 클래스로 가 이 디졸브 머테리얼을 저장할 변수를 만들자.

UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<UMaterialInstance> DissolveMaterialInstance;

UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<UMaterialInstance> WeaponDissolveMaterialInstance;

 

캐릭터가 죽으면 매시가 위의 머테리얼로 바뀌게 된다.

 

이제 매시를 바꿀 함수를 선언하자.

void Dissolve();

 

또한 디졸브의 타임라인을 진행시킬 함수를 선언한다. 해당 함수의 구현은 블루프린트에서 할 것이다.

UFUNCTION(BlueprintImplementableEvent)
void StartDissoveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);

 

이제 디졸브 함수를 구현하자.

 

동적 머테리얼을 생성해준다.

UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);

 

 

다이나믹 머티리얼은 머티리얼을 런타임 중 동적으로 생성하고 속성들을 바꿀 수 있는 머티리얼을 말한다.

 

그 다음 매시를 다이나믹 머테리얼로 바꾼다. 인덱스의 경우 바꾸려는 머테리얼 인덱스를 선택하면 되는데 현재는 머테리얼이 하나인 관계로 0번으로 지정했다. 만약 머테리얼이 여러개이면 개개인별로 다 설정을 해주어야 한다.

GetMesh()->SetMaterial(0, DynamicMatInst);

 

이제 블루프린트 구현 함수를 호출하면 된다.

 

전체 구조는 아래와 같다.

void AAuraCharacterBase::Dissolve()
{
    if (IsValid(DissolveMaterialInstance))
    {
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);
       GetMesh()->SetMaterial(0, DynamicMatInst);
       StartDissoveTimeLine(DynamicMatInst);
    }
    if (IsValid(WeaponDissolveMaterialInstance))
    {
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(WeaponDissolveMaterialInstance, this);
       Weapon->SetMaterial(0, DynamicMatInst);
       StartDissoveTimeLine(DynamicMatInst);
    }
}

 

이제 이 함수를 에너미가 죽을때 호출하면 된다.

 

이어서 블루프린트에서 함수를 완성시키자.


2. 디졸브 타임라인 적용하기

 

타임라인 노드를 만들자.

 

 

실수 트랙을 추가해준다.

 

 

키를 추가해준다.

 

마이너스의 값을 주는 이유는 디졸브 파라미터가 양수가 되면 디졸브가 적용되는 것이다. 즉 마이너스의 값을 주면 디졸브를 적용하지 않는 상태가 되는 것이다.

 

이제 함수를 연결해준다.

 

이 다음 머티리얼을 설정해야할 것이다.

 

아래 노드를 추가해준다.

 

파라미터 네임을 입력하게 되어있다.

 

 

디졸브 머티리얼에 해당하는 이름을 입력하자.

 

타임라인 노드와 연결해준다.

 

전체 노드는 아래와 같이 연결된다.

 

 

이렇게 하고 확인하니 제대로 되지를 않는다. 타임라인은 하나의 인스턴스에만 적용할 수 있기 때문인듯하다.

 

무기의 타임라인을 설정하는 함수와 매시의 타임라인을 설정하는 함수를 각각 만들어주면된다.


3. 버그 수정하기

 

UFUNCTION(BlueprintImplementableEvent)
void StartDissoveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);

UFUNCTION(BlueprintImplementableEvent)
void StartWeaponDissoveTimeLine(UMaterialInstanceDynamic* DynamicMaterialInstance);

 

이렇게 두개의 함수를 만들고 물론 매개변수도 각각에 맞게 설정해주어야 할 것이다.

 

void AAuraCharacterBase::Dissolve()
{
    if (IsValid(DissolveMaterialInstance))
    {
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this);
       GetMesh()->SetMaterial(0, DynamicMatInst);
       StartDissoveTimeLine(DynamicMatInst);
    }
    if (IsValid(WeaponDissolveMaterialInstance))
    {
       UMaterialInstanceDynamic* DynamicMatInst = UMaterialInstanceDynamic::Create(WeaponDissolveMaterialInstance, this);
       Weapon->SetMaterial(0, DynamicMatInst);
       StartWeaponDissoveTimeLine(DynamicMatInst);
    }
}

 

이제 다시 에디터에서 설정하자.

 

정상적으로 연결하면 디졸브가 잘 작동하는 것을 볼 수 있다.