인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

MOOOON님의 프로필 이미지
MOOOON

작성한 질문수

[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템

아이템 및 시너지 효과 스킬 적용

해결된 질문

작성

·

25

1

롤토체스같은 게임에서 아이템과 증강체 및 시너지 효과 등을 어떻게 구현하면 좋을지 고민하는데 궁금한게 생겨 질문드립니다.

예를 들어, 아이템을 장착하면 8초마다 주변 아군에게 보호막 부여와 같은 것을 구현할 때, 아이템을 장착하면 8초마다 주변 아군에게 보호막을 부여하는 패시브 스킬을 등록하고, 아이템을 해제하면 해당 패시브 스킬을 빼는 방식으로 만들면 될 것 같습니다.

시너지 효과로 3타마다 추가 투사체를 발사하는 효과는 시너지가 발동되면 3타인지 체크하는 UseCondition을 가진 패시브 스킬을 통해 추가 투사체를 발사하게 하면 될 것 같습니다.

그런데, 아이템을 장착하면 해당 캐릭터의 기본 공격 및 스킬이 체력 10% 이하인 적을 처형시키는 효과는 스킬로 구현이 어떻게 될지, 아니면 다른 좋은 방법이 있을지 떠오르지가 않아서 어떻게 구현할 수 있을지 질문드립니다.

답변 1

0

Developer G님의 프로필 이미지
Developer G
지식공유자

수강해주셔서 감사힙니다.

적을 처형하는 효과의 경우, onDealDamage처럼 Skill의 Owner가 자기가 공격한 대상을 알려주는 event를 만든 뒤, Effect의 Start 함수 같은 곳에서 해당 event를 구독하여 Owner가 때린 대상의 체력을 확인해서 처형하면 됩니다. 예를 들면 다음과 같습니다.

EffectAction.cs

public override Start(Effect effect)
{
    effect.Owner.Owner.onDealDamage += OnDealDamage;
}

public override bool Apply(Effect effect)
{ 
    // event를 통해 효과를 적용했다면, 상태를 리셋하고 true를 return
    if (isApplied)
    {
        isApplied = false;
        return true;
    }
    return isApplied;
}

public override Release(Effect effect)
{
    effect.Owner.Owner.onDealDamage -= OnDealDamage;
}

public void OnDealDamage(Entity target, float damage);
{
   // 대상 체력이 현재 체력의 10퍼 이하라면 처형
   if (target.Stats.GetValue(hpStat) <= target.Stats.GetMaxValue(hpStat) * 0.1f)
   {
       target.TakeDamage(Onwer.Owner, this, 999999f);
       isApplied = true;
   }
}


위는 예시이기에, 원하시는 기능을 정확히 구현하시려면 Effect의 동작을 좀 더 확장하실 필요가 있을 수도 있습니다.

주의하실 점은 이 경우 스킬, 아이템, Entity가 움직인 오브젝트 등 Entity가 소유한 객체들이 준 Damage도 모두 Entity의 onDealDamage event를 호출할 수 있도록 구조를 만들어주셔야 합니다.

예를 들어, 지금처럼 target의 TakeDamage 함수를 개별적으로 직접 호출하는게 아니라
Owner를 통해서 Damage를 주게 만들어야 합니다.

// param1: causer(여기선 Effect), param2: target, param3: damage
Owner.DealDamage(this, target, 9999f);

TakeDamage 대신 위와 같은 함수를 호출하고, DealDamage 함수 내부에서

{
// ...중략, 공격 강화 스킬 대한 처리와 데미지 공식을 통해 데미지 확정.

// TakeDamage가 방어 공식을 통해 확정한(=실제로 받은) Damage를 onDealDamage 함수에 넘겨줌
float appliedDamage = target.TakeDamage(this, causer, finalDamage);
onDealDamage?.Invoke(target, appliedDamage);
}


이런 식으로 처리해줄 필요가 있습니다.

감사합니다.

MOOOON님의 프로필 이미지
MOOOON
질문자

쿨타임이 0인 패시브 스킬(계속해서 작동)에 해당 이펙트 액션(처형)을 넣어서 아이템을 장착할 시에 해당 스킬을 장착하게 해주면 될까요?

Developer G님의 프로필 이미지
Developer G
지식공유자

말씀하신 것처럼 쿨타임 0인 패시브로 만드셔서 그때 그때 Effect를 새로 적용해주셔도 되고, Effect 자체를 적용 횟수가 무한인(=0)인 버프로 만드셔서 아이템 해제시까지 유지되게 만드셔도 됩니다.

방법은 자유롭게 하시면 될 것 같습니다.

다만, 문제가 없을지 꼼꼼히 살펴봐야겠죠.
예를 들어, 앞서 말씀드린 두 방식 모두 Effect가 이미 적용중일 때는 Condition을 통해 Skill이 발동하지 않도록 해야겠죠? 안그럼 Skill이 매 프레임마다 계속 새로운 Effect를 만들어낼테니까요.

MOOOON님의 프로필 이미지
MOOOON

작성한 질문수

질문하기