[25.07.17] TIL( 뱀파이어 방어구 생성 )

설민우·2025년 7월 17일

내일배움캠프 - Unity

목록 보기
78/85

📌 목표

  • 출혈 상태의 적을 대상으로 출혈 스택을 추출하여,
    • 스택 수만큼 흡혈 오브젝트(BloodOrb)를 생성
    • 플레이어에게 날아오며 체력 회복
  • 스택 수치에 따라 일정 시간 버프(FinalDamageMultiplier) 부여
  • 이후 일정 시간 후 버프 제거

💉 VampireAbsorbSkill 코드 핵심 요약

public override bool Activate()
{
    var enemies = FindEnemiesInCamera();
    int totalStacks = 0;

    foreach (var enemy in enemies)
    {
        if (!enemy.TryGetComponent(out EnemyDebuffHandler debuffHandler)) continue;

        int bleedStacks = debuffHandler.GetDebuffStack(DebuffType.Bleed);
        if (bleedStacks <= 0) continue;

        debuffHandler.RemoveDebuff(DebuffType.Bleed);
        debuffHandler.ApplyDebuffStacks(_vampireAbsorbSO, bleedStacks);

        for (int i = 0; i < bleedStacks; i++)
        {
            Vector3 offset = new Vector3(Random.Range(-0.4f, 0.4f), Random.Range(-0.4f, 0.4f), 0);
            Vector3 spawnPos = enemy.transform.position + offset;
            var orb = Instantiate(_bloodOrbPrefab, spawnPos, Quaternion.identity);
            orb.GetComponent<BloodOrbEffect>().Initialize(_playerHealth, 1f);
        }

        totalStacks += bleedStacks;
    }

    if (_buffCoroutine != null)
    {
        StopCoroutine(_buffCoroutine);
        _stat.RemoveModifier(_activeBuff);
    }

    if (totalStacks > 0)
    {
        totalStacks = Mathf.Min(totalStacks, _capacity);
        _activeBuff = new StatModifier(
            StatType.FinalDamageMultiplier,
            1f + totalStacks,
            StatModifier.ModifierMode.Multiplicative,
            sourceTag: "VampireAbsorbSkill"
        );

        _stat.AddModifier(_activeBuff);
        _buffCoroutine = StartCoroutine(RemoveBuffAfter(_buffDuration, _activeBuff));
    }

    return totalStacks > 0;
}

🧠 RuntimeStat 보조 기능 추가

public void RemoveAllModifiersOfTypeWithTag(StatType type, string tag)
{
    modifiers.RemoveAll(m => m.type == type && m.sourceTag == tag);
    OnStatChanged?.Invoke(type);
}

🩸 BloodOrbEffect 수정 사항

  • 생성 후 일정 시간(0.3~0.5초) 후
  • 플레이어를 추적해서 자연스럽게 도착
  • 도착 시 Heal + 오브젝트 파괴
private void StartChase()
{
    if (_target == null) return;

    transform.DOMove(_target.transform, _flyDuration)
        .SetEase(_flyEase)
        .OnUpdate(() =>
        {
            if (_target != null)
                transform.DOMove(_target.transform.position, _flyDuration);
        })
        .OnComplete(() =>
        {
            if (_target != null)
                _target.Heal(_healAmount);

            Destroy(gameObject);
        });
}

✅ 주의 사항

  • 동일한 StatType의 버프가 여러 번 겹칠 수 있으므로, 반드시 sourceTag 기반으로 삭제 처리해야 함
  • RemoveModifier() 외에 RemoveAllModifiersOfTypeWithTag() 로도 방어코드 작성
  • 체력 회복 총량은 _maxHealPercent * maxHP 등으로 제한 가능 (추후 확장 예정)

🔚 정리

이 시스템은 뱀파이어 방어구 스킬의 핵심인 출혈 → 흡혈 → 버프 → 회복 흐름을 매끄럽게 구현한 구조다.
DOTween과 StatModifier 시스템의 조합으로 애니메이션 + 스탯 버프 관리를 안정적으로 구현함.

profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글