0. 개요

몬스터 또는 플레이어 캐릭터의 체력이 0이 되었을 때 사망 몽타주를 재생하고 월드에서 제거하도록 한다.

 

 

1. 죽음

죽음은 플레이어와 몬스터 캐릭터 모두 실행되므로 CombatInterface와 AuraCharacterBase를 이용할 수 있다.

 

(1) 인터페이스 구현

	virtual void Die() = 0;
};

 

 

(2) 랙돌 멀티캐스트 RPC - AuraCharacterBase

	virtual void Die() override;

	// 랙돌 멀티캐스트 RPC
	UFUNCTION(NetMulticast, Reliable)
	virtual void MulticastHandleDeath();

랙돌 효과가 발동한 것을 클라이언트에게 알리기 위해서 RPC를 생성한다.

void AAuraCharacterBase::MulticastHandleDeath_Implementation()
{
	// 무기 랙돌
	Weapon->SetSimulatePhysics(true);
	Weapon->SetEnableGravity(true);
	Weapon->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly);

	// 캐릭터 랙돌
	GetMesh()->SetSimulatePhysics(true);
	GetMesh()->SetEnableGravity(true);
	GetMesh()->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly);
	GetMesh()->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); // worldstatic에 대해 부딫힘

	// 캐릭터 충돌 비활성화
	GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}

랙돌 효과를 위해 콜리전과 중력, 물리학 계산에 대한 옵션을 지정한다.

 

 

(3) 무기 떨어트리고 랙돌 재생하기

void AAuraCharacterBase::Die()
{
	// 서버에서 실행되는 함수
	// 무기 떨어트림
	Weapon->DetachFromComponent(FDetachmentTransformRules(EDetachmentRule::KeepWorld, true));

	// 랙돌 재생
	MulticastHandleDeath();
}

 

 

(4) 몬스터 클래스에 죽음 오버라이드

몬스터 클래스의 수명을 설정하고 랙돌 효과를 발생시키는 부모의 Die 함수를 호출한다.

	UPROPERTY(EditAnywhere, BlueprintReadOnly, category = "Combat")
	float LifeSpan = 5.f;
void AAuraEnemy::Die()
{
    // 수명 설정
    SetLifeSpan(LifeSpan);

    // 랙돌 효과와 무기 드랍
    Super::Die();
}

 

 

(5) PostGameplayEffectExecute - AuraAttributeSet

이 함수는 게임플레이 이펙트가 발동한 후에 호출된다.

        if (LocalIncomingDamage > 0.f)
        {
            const float NewHealth = GetHealth() - LocalIncomingDamage;
            SetHealth(FMath::Clamp(NewHealth, 0, GetMaxHealth()));

            const bool bFatal = NewHealth <= 0.f;
            if (bFatal)
            {
                ICombatInterface* CombatInterface = Cast<ICombatInterface>(Props.TargetAvatarActor);
                if (CombatInterface)
                {
                    CombatInterface->Die();
                }
            }
            else
            {
                FGameplayTagContainer TagContainer;
                TagContainer.AddTag(FAuraGameplayTags::Get().Effects_HitReact);

                // 부여된 어빌리티를 찾아서 활성화
                Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
            }
        }

치명적인 상태인 bFatal가 true일 경우 전투 인터페이스를 가져와 Die를 호출한다.