[25.07.2] TIL( 팀프로젝트 - 무기 1차 완성 및 합성기능 제작 진행 )

설민우·2025년 7월 2일

내일배움캠프 - Unity

목록 보기
69/85

Nuke Strike Skill 및 관련 기능 구현

목표

NukeStrikeSkill에 대한 기능을 개선하며, 스킬 효과에 포함된 폭발 이펙트와 지속 장판 데미지를 구현하였습니다. 또한, 적절한 위치 보정을 적용하여 효과가 정확히 바닥에 닿도록 했습니다.


핵심 변경 사항

1. NukeStrikeSkill 스킬 수정

기능 변경

  • 스킬 쿨타임 등록 방지: 쿨타임이 등록되지 않도록, 탄약이 부족하거나 열기가 부족한 경우 스킬을 취소하는 기능을 추가했습니다.
  • 미사일 효과 및 폭발: 미사일이 낙하하면서 목표 지점에 도달한 후 폭발이 일어납니다. 이를 위해 미사일이 내려오는 동작을 추가하고, 목표 지점에 폭발 이펙트와 즉시 데미지를 적용했습니다.
  • 장판 효과: 폭발 이후, 일정 시간 동안 지속되는 장판 데미지가 추가되었습니다. 이 장판은 일정 범위 내의 적에게 지속적으로 데미지를 주는 효과를 가집니다.

기능 흐름

  • 조준 마커: 플레이어의 입력에 따라, 마커를 화면에 띄워 조준을 유도합니다.
  • 미사일 낙하: 목표 지점에 미사일을 발사하고, 낙하 후 폭발합니다.
  • 즉시 데미지: 폭발 후, 주변 적들에게 즉시 데미지를 적용합니다.
  • 장판 데미지: 폭발 후, 일정 범위에 지속적으로 데미지를 주는 장판이 생성됩니다.

변경 코드

private void ExplodeAt(Vector2 position)
{
    if (_explosionPrefab != null)
    {
        GameObject explosion = Instantiate(_explosionPrefab, position, Quaternion.identity);
        InstantDamageEffect instantEffect = explosion.GetComponent<InstantDamageEffect>();
        
        // 폭발 이펙트의 yOffset 보정
        if (explosion.TryGetComponent<SpriteRenderer>(out var sprite))
        {
            float yOffset = sprite.bounds.size.y / 2f;
            explosion.transform.position += Vector3.up * yOffset;
        }

        var ranged = _weapon as RangedWeapon;
        if (ranged != null)
        {
            float[] baseDamage = new float[] { _skill.BaseDamageByLevel, _skill.BaseDamageByLevel };
            var payload = _weapon.StatProvider.CreatePayloadFrom(true);
            instantEffect.SetPayload(baseDamage, 1f, payload, true, false, 2f);
        }
    }
    
    // 지속 장판
    if (_damageZonePrefab != null)
    {
        GameObject zone = Instantiate(_damageZonePrefab, position, Quaternion.identity);
        var zoneEffect = zone.GetComponent<DamageZoneEffect>();
        if (zoneEffect != null)
        {
            float[] baseDamage = new float[] { _skill.BaseDamageByLevel, _skill.BaseDamageByLevel };
            var payload = _weapon.StatProvider.CreatePayloadFrom(true);
            zoneEffect.SetPayload(baseDamage, 1f, payload, true, false, false, 0, _zoneDuration);
        }

        Destroy(zone, _zoneDuration);
    }
}

2. DamageZoneEffect 수정

기능 변경

  • 즉시 데미지 및 지속 데미지: 장판이 활성화될 때, DamageZoneEffect 컴포넌트를 이용해 즉시 데미지와 지속 데미지를 적용할 수 있게 만들었습니다. 이를 통해 장판 범위 내의 적에게 주기적으로 데미지를 주고, 폭발 시 즉시 데미지를 적용하는 효과가 이루어집니다.
  • 위치 보정: 폭발 및 장판 이펙트가 바닥에 정확하게 배치되도록 SpriteRenderer의 크기를 기반으로 yOffset을 계산하여 위치 보정합니다.

기능 흐름

  • 즉시 데미지: 장판이 활성화되면서 범위 내 적들에게 즉시 데미지를 주고, 일정 시간이 지난 후 지속 데미지를 적용합니다.
  • 위치 보정: 장판이 바닥에 정확히 배치되도록 yOffset을 계산하여, 폭발과 장판의 위치를 보정합니다.

변경 코드

private void ApplyInstantDamage()
{
    Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, _instantDamageRadius, _enemyLayer);
    foreach (var hit in hits)
    {
        if (hit.TryGetComponent<DamageablePart>(out var enemy))
        {
            bool isCrit = Random.value < _payload.CritChance;
            float finalDamage = _payload.GetFinalDamage(_weaponBaseDamage, _weaponMultiplier, _isSkill, _isMelee, isCrit);
            enemy.TakePartDanage(transform.position, finalDamage, isCrit);
        }
    }
}

기타 개선 사항

  • 위치 보정 및 정확한 폭발: yOffset을 계산하여, 폭발 이펙트와 장판이 바닥에 정확히 맞춰지도록 했습니다.
  • 효율성 개선: DamageZoneEffect의 반복적인 데미지 적용 방식과 InstantDamageEffect의 즉시 데미지 기능을 잘 분리하여 관리할 수 있도록 수정하였습니다.
profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글