[Unity] 스킬에 추가 효과 부여하기

muchan
muchan
∙∙조회 9

문제: 보상마다 새 스킬을 만들 순 없다

현재 프로젝트로 로그라이크 타워 디펜스를 만드는 중인데 웨이브 클리어 보상을 뭘로 줄지 고민을 했다. 가장 쉬운 답은 "새 스킬"이지만 그렇게 하면 스킬 개수가 웨이브를 돌 때마다 늘어난다. 밸런스 잡기도 힘들고 플레이어가 외워야 할 것도 계속 늘어난다.

그렇게 생각해 낸 아이디어는 보상은 새 스킬이 아니라 이미 있는 스킬 위에 얹는 특수효과로 준다. 화염구 스킬이 있으면 "맞은 자리에 화상 남기기", "한 번 더 터지기" 같은 효과를 나중에 붙여주는 식이다.

나쁜 방법: 스킬 매니저가 특수효과를 다 알게 하기

가장 직관적인 구현은 스킬 매니저 안에 조건문을 박아넣는 것이다.

csharp
// 이렇게 하면 안 된다
void ResolveImpact(...) {
    if (player.HasBurnEffect) ApplyBurn(...);
    if (player.HasCountEffect) CastExtraImpact(...);
    if (player.HasBombEffect) SpawnBomb(...);
    // 효과가 늘어날 때마다 여기가 계속 길어진다
}

이러면 스킬 매니저는 존재하는 모든 특수효과를 알아야 하는 신세가 된다. 효과를 하나 추가할 때마다 스킬 매니저 코드를 또 열어야 한다.

택한 구조: 발행자는 구독자를 모른다

대신 반대 방향으로 설계했다. 스킬 매니저는 "여기 맞았다"는 사실만 이벤트로 흘려보내고 특수효과들이 각자 알아서 구독해서 반응한다.

csharp
// SkillManager.cs
public event Action<SkillCastContext> ImpactResolved;

스킬 매니저는 이 이벤트를 누가 구독하는지 몇 개나 구독하는지 전혀 모른다. 그냥 임팩트가 날 때마다 발행할 뿐이다.

특수효과 쪽 베이스 클래스는 이렇게 생겼다.

csharp
// SkillEffect.cs — 모든 특수효과의 베이스
public void OnRewardApplied(int amount) {
    Level += amount;
    if (!subscribed && TrySubscribe())
        subscribed = true;   // 보상을 처음 획득한 시점(0→1)에만 구독
}

protected virtual bool TrySubscribe() {
    SkillManager.Instance.ImpactResolved += HandleImpact;
    return true;
}

플레이어가 웨이브 보상으로 화상 효과를 고르는 순간 BurnEffect가 ImpactResolved를 구독하기 시작한다. 그 뒤로는 스킬이 맞을 때마다 자동으로 도트 데미지가 걸린다. 스킬 매니저 코드는 단 한 줄도 바뀌지 않는다.

이 구조가 마음에 드는 이유

1. 결합도가 낮다. 스킬 매니저는 특수효과의 존재 자체를 모른다. 새 효과를 만들 때 스킬 매니저 쪽을 건드릴 일이 없다.

2. 확장이 쉽다. 새 효과가 필요하면 SkillEffect를 상속한 클래스 하나만 추가하면 된다. 우리 프로젝트에는 BurnEffect(화상), CountEffect(추가 타격), BombEffect(지연 폭발)가 각각 독립적으로 늘어나 있다.

3. 다른 이벤트로도 유연하게 갈아탈 수 있다. 버프 스킬에 화상을 얹는 BurnBuff는 같은 베이스를 상속하면서도 ImpactResolved가 아니라 BuffSkillManager.BuffResolved를 구독하도록 오버라이드했다. 베이스 구조를 안 건드리고 "무엇을 구독할지"만 바꿔서 완전히 다른 스킬에도 붙일 수 있었다.

csharp
// BurnBuff.cs — 같은 베이스, 다른 이벤트를 구독
protected override bool TrySubscribe() {
    BuffSkillManager.Instance.BuffResolved += HandleBuff;
    return true;
}

정리

결국 이 구조의 핵심은 한 문장으로 요약된다. 발행자는 구독자를 몰라야 한다. 그 원칙 하나만 지켰더니 스킬 매니저를 건드리지 않고도 특수효과를 계속 늘릴 수 있는 시스템이 됐다.