언리얼/엔진 공부

Unreal Engine 5 - 델리게이트

곰바닥 2023. 2. 22. 17:19

개요

보스 몬스터와 부하 몬스터가 있다고 생각해보자.

보스가 버프를 사용하면 부하의 공격력이 증가하고

보스가 죽으면 부하도 죽는 코드를 구현해보자.

 

델리게이트 X

<hide/>
class Boss
{
public:
    bool IsUsingBuff = false;
    bool IsDie = false;
};


class Servant //부하
{
public:
    void BossBuffCheck(Boss boss)
    {
        if (boss.IsUsingBuff == true)
        {
            AtkUP();
        }
    }

    void BossDieCheck(Boss boss)
    {
        if (boss.IsDie == true)
        {
            Suicide();
        }
    }

    void AtkUP()
    {
        //중복 호출 방지
        
        //공격력 증가
    }

    void Suicide()
    {
        //중복 호출 방지

        //자살
    }
};

 

위 코드는 Update문에서 부하의 BossBuffCheck와 BossDieCheck를 통해 보스의 상태를 계속 체크해야 한다.

매우 비효율적이다.

보스가 버프를 사용하거나 죽는 이벤트 때 부하의 AtkUp나 Suicide가 자동으로 호출되면 좋을 것이다.

이럴 때 사용하는 것이 델리게이트다.

 

 

델리게이트 O

<hide/>
class Boss
{
public:
    delegate OnBossUseBuff; //보스가 버프를 사용함
    delegate OnBossDie; // 보스가 죽음

    //내부 로직    
};


class Servant //부하
{
public:
    Servant(Boss boss)
    {
        boss.OnBossUseBuff(this, &Servant::AtkUP); //보스가 버프를 사용할 때 AtkUP 호출
        boss.OnBossDie(this, &Servant::Suicide); //보스가 죽으면 Suicide 호출
    }

    void AtkUP()
    {     
        //공격력 증가
    }

    void Suicide()
    {
        //자살
    }
};

 

Unreal Engine 5 - Delegate vs Dynamic Delegate

Delegate

델리게이트 선언 

DECLARE_DELEGATE

 

함수 등록 

AddUObject(객체, 함수 이름)

AddLambda


Dynamic Delegate

델리게이트 선언 

DECLARE_DYNAMIC_DELEGATE

 

함수 등록 

AddDynamic(객체, 함수 이름)

등록하는 함수는 반드시 UFUNCTION 매크로를 사용해야 한다. - 따라서 람다식 사용이 불가능하다.