유니티/게임 프로젝트

2D RPG - (15 - 9) 단검 투척 스킬 구현_09

monstro 2025. 2. 6. 01:50
728x90
반응형

이번 포스트에서는 단검에 적중당한 적을 약간 경직시키도록 로직을 추가하겠습니다.

또한 코드의 구조를 일부 개선하고 검이 너무 멀리 날아간 경우 파괴하는 로직을 추가하겠습니다.

위의 과정을 통해 단검 투척 스킬 구현을 마무리하겠습니다.

 

1) 멀리 날아간 단검 파괴 - SkillThrowingSwordController

 

 

투척될 단검이 설정된 후 7초 뒤에 Invoke 함수를 통해

DestroySword 메소드를 호출하여 검을 파괴하겠습니다.

 

2) 단검에 적중당한 적 경직 - EnemyController

public class EnemyController : BaseCharacterController
{
    [Header("Move Info")]
	.
	.
	.
    private float _defaultMoveSpeed;

	.
	.
	.

    protected override void Awake()
    {
        
		.
		.
		.
        
        _defaultMoveSpeed = _moveSpeed;
    }

	.
	.
	.

    public virtual void DoFreezeEnemy(bool isTimerFrozen)
    {
        if (isTimerFrozen)
        {
            _moveSpeed = 0;
            _animator.speed = 0;
        }
        else
        {
            _moveSpeed = _defaultMoveSpeed;
            _animator.speed = 1;
        }
    }

    protected virtual IEnumerator FreezeEnemyTimer(float seconds)
    {
        DoFreezeEnemy(true);

        yield return new WaitForSeconds(seconds);

        DoFreezeEnemy(false);
    }
}

 

적을 조작하면서 동시에 적 자체를 의미하는 클래스 EnemyController프로퍼티를 추가합니다.

해당 프로퍼티는 이동속도캐싱하는 용도로 사용합니다.

 

Awake 메서드에서 우선 적의 이동속도캐싱합니다.

 

DoFreezeEnemy 메서드는 인자로 들어오는 불리언 값에 따라

이동속도애니메이터의 속도설정하게 됩니다.

 

코루틴으로 동작하는 FreezeEnemyTimer는 인자로 들어온 실수 값에 따라

적을 경직시킨 후 인자값의 시간 후다시 경직을 해제합니다.

 

 

3) 단검에 적중당한 적 경직 - SkillThrowingSwordController

public class SkillThrowingSwordController : MonoBehaviour
{
 	.
	.
	.
    
    private float _freezeTimeDuration;

	.
	.	
	.

    private void DestroySword()
    {
        Destroy(gameObject);
    }

    public void SetupBounceSword(bool isBouncing, int bounceAmount, float bounceSpeed)
    {
        
		.
		.
		.
        
        _bounceSpeed = bounceSpeed;
        _enemyTargets = new List<Transform>();
    }

	.
	.
	.

    public void SetUpSword(Vector2 dir, float gravityScale, PlayerController player, float freezeTimeDuration, float returnSpeed)
    {
        
		.
		.
		.

        _freezeTimeDuration = freezeTimeDuration;
        _returnSpeed = returnSpeed;

		.
		.
		.

        Invoke("DestroySword", 7.0f);
    }

	.
	.
	.

    private void SwordSpin()
    {
        if (_isSpinning)
        {
            
			.
			.
			.

            if (_wasSpinStopped)
            {
				.
				.
				.

                if (_hitTimer < 0)
                {
                    _hitTimer = _hitCooldown;

                    Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 1);

                    foreach (Collider2D hit in colliders)
                    {
                        if(hit.GetComponent<EnemyController>())
                            SwordSkillEffect(hit.GetComponent<EnemyController>());
                    }
                }
            }
        }
    }

	.
	.
	.

    private void SwordBounce()
    {
        if (_isBouncing && _enemyTargets.Count > 0)
        {
            
			.
			.
			.

            if (Vector2.Distance(transform.position, _enemyTargets[_targetIndex].position) < 0.1f)
            {
                SwordSkillEffect(_enemyTargets[_targetIndex].GetComponent<EnemyController>());

				.
				.
				.
                
            }
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        
		.
		.
		.

        if (collision.GetComponent<EnemyController>())
        {
            EnemyController enemy = collision.GetComponent<EnemyController>();
            SwordSkillEffect(enemy);
        }

		.
		.
		.
        
    }

    private void SwordSkillEffect(EnemyController enemy)
    {
        enemy.DoGetDamage();
        enemy.StartCoroutine("FreezeEnemyTimer", _freezeTimeDuration);
    }

	.
	.
	.

    
}

 

단검 투척 스킬을 조작하는 클래스 SkillThrowingSwordController에서 가장 많은 변경점은

우선, 기존에 피격당한 적을 대상으로 데미지를 발생시키던 로직

메서드 SwordSkillEffect에서 수행한다는 점입니다.

따라서 이전에 적에게 데미지를 주던 로직을 위와 같이 SwordSkillEffect로 대체하였습니다.

 

또한 클래스 SkillThrowingSwordController에서 직접 에디터를 통해 값을 설정하는 방식 대신,

스킬 매니저의 SkillThrowingSword 클래스에서 에디터를 통해 설정한 값받아와

클래스 SkillThrowingSwordController의 값을 설정하는 방식으로 변경하였습니다.

 

4) 단검에 적중당한 적 경직 - SkillThrowingSword

 

 

위와 같은 구조로 개선되어 최종적으로 에디터에서는 다음과 같이 구조가 나타납니다.

 

SkillThrowingSwordController는 값을 설정하지 않아도 되고,

 

SkillManager의 SkillThrowingSword에서 필요한 값들을 설정하면 됩니다.

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

 

728x90
반응형