[Unity] 스킬에 추가 효과 부여하기
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
현재 프로젝트로 로그라이크 타워 디펜스를 만드는 중인데 웨이브 클리어 보상을 뭘로 줄지 고민을 했다. 가장 쉬운 답은 "새 스킬"이지만 그렇게 하면 스킬 개수가 웨이브를 돌 때마다 늘어난다. 밸런스 잡기도 힘들고 플레이어가 외워야 할 것도 계속 늘어난다.
그렇게 생각해 낸 아이디어는 보상은 새 스킬이 아니라 이미 있는 스킬 위에 얹는 특수효과로 준다. 화염구 스킬이 있으면 "맞은 자리에 화상 남기기", "한 번 더 터지기" 같은 효과를 나중에 붙여주는 식이다.
가장 직관적인 구현은 스킬 매니저 안에 조건문을 박아넣는 것이다.
// 이렇게 하면 안 된다
void ResolveImpact(...) {
if (player.HasBurnEffect) ApplyBurn(...);
if (player.HasCountEffect) CastExtraImpact(...);
if (player.HasBombEffect) SpawnBomb(...);
// 효과가 늘어날 때마다 여기가 계속 길어진다
}
이러면 스킬 매니저는 존재하는 모든 특수효과를 알아야 하는 신세가 된다. 효과를 하나 추가할 때마다 스킬 매니저 코드를 또 열어야 한다.
대신 반대 방향으로 설계했다. 스킬 매니저는 "여기 맞았다"는 사실만 이벤트로 흘려보내고 특수효과들이 각자 알아서 구독해서 반응한다.
// SkillManager.cs
public event Action<SkillCastContext> ImpactResolved;
스킬 매니저는 이 이벤트를 누가 구독하는지 몇 개나 구독하는지 전혀 모른다. 그냥 임팩트가 날 때마다 발행할 뿐이다.
특수효과 쪽 베이스 클래스는 이렇게 생겼다.
// 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를 구독하도록 오버라이드했다. 베이스 구조를 안 건드리고 "무엇을 구독할지"만 바꿔서 완전히 다른 스킬에도 붙일 수 있었다.
// BurnBuff.cs — 같은 베이스, 다른 이벤트를 구독
protected override bool TrySubscribe() {
BuffSkillManager.Instance.BuffResolved += HandleBuff;
return true;
}
결국 이 구조의 핵심은 한 문장으로 요약된다. 발행자는 구독자를 몰라야 한다. 그 원칙 하나만 지켰더니 스킬 매니저를 건드리지 않고도 특수효과를 계속 늘릴 수 있는 시스템이 됐다.
![[Unity] 렌더 큐](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1785158340538-3i4lkp/_____2026-07-27_215606.png)
유니티 렌더 큐
타워 디펜스에 타워 합성 시스템 구현
![[Unity] 피벗은 뭐고 앵커는 머요](https://data.develog.develrocket.com/upload/develog/user_1776858831954/1784966048688-1uin6m/image.png)
네모들의 위치를 피벗과 앵커로 설명하시오
![[Unity] 렌더 큐](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1785158340538-3i4lkp/_____2026-07-27_215606.png)
![[Unity] 피벗은 뭐고 앵커는 머요](https://data.develog.develrocket.com/upload/develog/user_1776858831954/1784966048688-1uin6m/image.png)