유니티/게임 프로젝트

2D RPG - (16 - 2) 블랙홀 스킬 구현_02

monstro 2025. 2. 11. 20:02
728x90
반응형

이번 포스트에서는 블랙홀에 묶여있는 적을 대상으로 올바른 키를 전부 입력한 후 R키를 누르면

분신이 나타나 적을 공격하는 기능을 구현해보도록 하겠습니다.

기존의 클론 생성 스킬을 수정하고 블랙홀 스킬의 Controller를 다듬어보는 방식으로 진행하겠습니다.

 

1) SkillCloningController

public class SkillCloningController : MonoBehaviour
{
    
	.
	.
	.

    public void DoSetupClone(Transform newTransform, float cloneDuration, bool canAttack, Vector3 offset)
    {
        if (canAttack)
            _animator.SetInteger("AttackNumber", Random.Range(1, 3));

        gameObject.transform.position = newTransform.position + offset;
        _cloneTimer = cloneDuration;

        DoFaceClosestTarget();
    }

	.
	.
	.
    
}

 

분신술 스킬의 동작을 정의SkillCloningController의 경우 기존의 분신 설정 메서드 DoSetupClone

추가적으로 Vector3 값을 인자로 받아 분신의 생성 위치를 조정하도록 합니다.

 

2) SkillCloning

public class SkillCloning : SkillTemplate
{
    
	.
	.
	.
    
    public void DoCreateClone(Transform clonePosition, bool canAttack, Vector3 offset)
    {
        GameObject newClone = Instantiate(_clonePrefab);

        newClone.GetComponent<SkillCloningController>().DoSetupClone(clonePosition, _cloneDuration, canAttack, offset);
    }
}

 

DoSetupClone 스킬이 변경되었으므로,

분신술 스킬 그 자체인 SkillCloning 클래스에서도 동일하게 로직을 변경해줍니다.

 

3) SkillBlackHoleController

public class SkillBlackHoleController : MonoBehaviour
{
    
	.
	.
	.
    private bool _canCreateHotKey = true;

    // Black Hole Info
    // 순서대로 줄어드는 속도 / 줄어들 수 있는지 판단
	.
	.
	.
    public float _shrinkSpeed;
    public bool _canShrink;

    // Created Clone Info
    // 순서대로 공격 횟수 / 공격 쿨타임 / 쿨타임을 위한 타이머 / 공격이 가능한지 판단
    public int _amountOfAttacks = 4;
    public float _cloneAttackCooldown = 0.1f;
    public float _cloneAttackTimer;
    public bool _canCloneAttack;

	.
	.
	.
    // 생성된 HotKey를 저장할 리스트
    private List<GameObject> _createdHotKeys = new List<GameObject>();

    private void Update()
    {
        // 타이머를 동작
        _cloneAttackTimer -= Time.deltaTime;

        // 만약 R키가 눌렸다면 
        if (Input.GetKeyDown(KeyCode.R))
        {
            // 저장중인 생성된 HotKey를 전부 파괴하고 분신이 공격할 수 있도록 설정 + HotKey의 생성을 막음 
            DestroyHotKeys();
            _canCloneAttack = true;
            _canCreateHotKey = false;
        }

        // 타이머가 0보다 작고, 분신이 공격할 수 있다면
        if (_cloneAttackTimer < 0 && _canCloneAttack)
        {
            // 분신의 공격 쿨타임을 걸고
            _cloneAttackTimer = _cloneAttackCooldown;

            // 이전의 로직에 추가적으로 분신의 생성 위치를 50% 확률로 설정함
            int randomIndex = Random.Range(0, _targets.Count);
            float randomXOffset = Random.Range(0, 100) > 50 ? 2 : -2;

            // 분신을 생성하고 공격 횟수 1차감
            SkillManager._skillManagerInstance._skillCloning.DoCreateClone(_targets[randomIndex], _canCloneAttack, new Vector3(randomXOffset, 0, 0));
            _amountOfAttacks--;

            // 공격횟수가 0이라면
            if (_amountOfAttacks <= 0) 
            {
                // 블랙홀의 크기를 줄이고 + 분신의 공격을 막음
                _canShrink = true;
                _canCloneAttack = false;
            }
        }

        // 블랙홀이 성장할 수 있다면 보간을 통해 크기를 늘리고
        if (_canGrow && !_canShrink)
        {
            transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(_maxSize, _maxSize), _growSpeed * Time.deltaTime);
        }

        // 블랙홀이 성장할 수 없다면 보간을 통해 크기를 줄이고, 어느 정도 줄어들면 파괴
        if (_canShrink)
        {
            transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(-1, -1), _shrinkSpeed * Time.deltaTime);
            if (transform.localScale.x <= 0)
                Destroy(gameObject);
        }
    }

	.
	.
	.

    private void CreateHotKey(Collider2D collision)
    {
        if (_keyCodeList.Count == 0)
            return;
        
        // 이전의 로직에 추가적으로 HotKey를 생성할 수 없는지 판단하여 얼리 리턴
        if (_canCreateHotKey == false)
            return;

 		.
		.
		.
       
    }

    private void DestroyHotKeys()
    {
        // 저장되어 있는 생성된 HotKey가 없다면 얼리 리턴
        if (_createdHotKeys.Count <= 0)
            return;

        // 저장되어 있는 생성된 HotKey를 순회하며 파괴
        foreach (GameObject createdHotKey in _createdHotKeys)
            Destroy(createdHotKey);
    }

 	.
	.
	.
    
}

 

블랙홀 스킬의 동작을 정의하는 클래스 SkillBlackHoleController의 로직을 위와 같이 변경합니다.

변경된 로직에서는 생성된 HotKey를 누른 후 R 키를 누름으로써 분신을 생성해 적을 공격합니다.

 

최종 실행 결과는 다음과 같습니다.

 

728x90
반응형