유니티/게임 프로젝트

2D RPG - (17 - 4) 크리스탈 스킬 구현_04

monstro 2025. 2. 19. 21:15
728x90
반응형

이번 포스트에서는 여러개의 크리스탈을 생성하여 적을 공격하도록 해보겠습니다.

 

1) SkillCrystal

 

위와 같이 크리스탈을 여러 개 생성하는데 필요한 여러 프로퍼티를 추가하였습니다.

위에서부터 순서대로 간단하게 설명하자면,

크리스탈을 여러 개 생성할 것인지를 결정하는 불리언 변수입니다.

다음으로는 생성할 크리스탈의 최대 개수를 의미합니다.

크리스탈이 전부 채워지면 크리스탈 스킬의 쿨타임이 될 float형 변수입니다.

장전된 크리스탈이 다 소모되면 장전 함수를 Invoke하는데 사용할 float형 변수입니다.

마지막으로 생성된 크리스탈을 저장할 List입니다.

 

 

기존의 UseSkill 함수에서, 크리스탈을 여러 개 사용하는 경우 이후 로직의 수행을 막습니다.

 

.
.
.

private bool CanUseMultiCrystal()
{
    // 크리스탈을 여러개 생성할 수 있다면
    if (_canMakeMultiCrystal)
    {
        // 리스트에 크리스탈이 하나 이상 존재한다면
        if (_crystalList.Count > 0)
        {
            // 장전된 크리스탈이 다 떨어진 경우, ResetCrystalAbility 함수로 스킬 자체를 초기화
            if (_crystalList.Count == 0)
                Invoke("ResetCrystalAbility", _useTimeWindow);

            // 크리스탈을 발사하는 동안, 쿨타임을 막고
            _cooldown = 0;
            // 리스트의 크리스탈을 소모함
            GameObject crystalToSpawn = _crystalList[_crystalList.Count - 1];
            GameObject newCrystal = Instantiate(crystalToSpawn, _playerController.transform.position, Quaternion.identity);
            _crystalList.Remove(crystalToSpawn);

            // 소모한 크리스탈을 설정
            newCrystal.GetComponent<SkillCrystalController>()?.SetupCrystal(_crystalExistTime, _canExplode, _canMoveToEnemy, _moveSpeed, FindClosestEnemy(newCrystal.transform));

            // 크리스탈을 전부 소모하여 다 떨어진 경우
            if (_crystalList.Count <= 0)
            {
                // 쿨타임을 적용시키고 재장전
                _cooldown = _multiStackCooldown;
                RefillCrystal();
            }

            // 여기까지 도착하였으면 성공적으로 로직을 수행하였으므로 true
            return true;
        }
    }

    // 여기에 도착했으면 로직에 문제가 있으므로 false
    return false;
}

.
.
.

 

UseSkill 함수에서 호출하는 CanUseSkill의 경우 위와 같이 로직이 구성되었습니다.

 

 

RefillCrsytal 함수의 경우, 크리스탈을 재장전하는 용도로 사용합니다.

 

 

ResetCrystalAbility의 경우, 크리스탈 스킬 자체의 쿨타임을 적용하는 용도로 사용합니다.

이제 실제 실행 결과를 확인해보겠습니다.

 

728x90
반응형