유니티/게임 프로젝트

2D RPG - (15 - 7) 단검 투척 스킬 구현_07

monstro 2025. 2. 5. 20:23
728x90
반응형

이번 포스트에서는 투척되는 단검에 새롭게 상태를 추가하고 기존의 단검을

상태에 따라 다르게 동작하도록 코드를 재구성해보겠습니다.

 

1) SkillThrowingSword

public enum SwordType
{ 
    Regular,
    Bounce,
    Pierce,
    Spin
}

public class SkillThrowingSword : SkillTemplate
{
    public SwordType _swordType = SwordType.Regular;

	.
	.
	.

    [Header("Pierce Info")]
    [SerializeField]
    private int _pierceAmount;
    [SerializeField]
    private float _pierceGravity;

    protected override void Start()
    {
        
		.
		.
		.

        SetupSwordGravity();
    }

    private void SetupSwordGravity()
    {
        if (_swordType == SwordType.Bounce)
            _swordGravity = _bounceGravity;
        else if(_swordType == SwordType.Pierce)
            _swordGravity = _pierceGravity;
    }

	.
	.
	.

    public void CreateSword()
    {
        
		.
		.
		.
        
        if (_swordType == SwordType.Bounce)
            throwingSwordController.SetupBounceSword(true, _bounceAmount);
        else if (_swordType == SwordType.Pierce)
            throwingSwordController.SetupPierceSword(_pierceAmount);
        
		.
		.
		.
        
    }

	.
	.
	.

}

 

단검 투척 스킬 그 자체를 의미하는

클래스 SkillThrowingSword새로운 enum SwordType을 추가하였습니다.

순서대로 일반 단검, 튕겨지는 단검, 관통 단검, 회전 단검을 의미합니다.

 

또한 새로운 프로퍼티를 추가하여 SwordType을 저장할 수 있도록 합니다.

그리고 Pierce 설정에 따른 관통 횟수관통 단검의 중력 수치 역시 프로퍼티로 들고 있도록 합니다.

 

Start 메서드에서는 마지막에 SetupSwordGravity 메서드 호출합니다.

SetupSwordGravity 메서드SwordType에 따라 단검의 중력을 설정합니다.

 

단검을 생성하는 CreateSword 메서드에서는 SwordType에 따라

적절한 SkillThrowingSwordController의 메서드호출하도록 로직을 구성하였습니다.

 

 

2) SkillThrowingSwordController

public class SkillThrowingSwordController : MonoBehaviour
{
    
	.
	.
	.

    [Header("Pierce Info")]
    [SerializeField]
    private float _pierceAmount;
    
	.
	.
	.

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

    public void SetupPierceSword(int pierceAmount)
    { 
        _pierceAmount = pierceAmount;
    }

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

		.
		.
		.

        if(_pierceAmount <= 0)
            _animator.SetBool("Rotation", true);
    }

	.
	.
	.

    private void Update()
    {
        
		.
		.
		.

        SwordBounce();
    }

    private void SwordBounce()
    {
        if (_isBouncing && _enemyTargets.Count > 0)
        {
            transform.position = Vector2.MoveTowards(
                transform.position,
                _enemyTargets[_targetIndex].position,
                _bounceSpeed * Time.deltaTime
            );

            if (Vector2.Distance(transform.position, _enemyTargets[_targetIndex].position) < 0.1f)
            {
                _targetIndex++;
                _bounceAmount--;

                if (_bounceAmount <= 0)
                {
                    _isBouncing = false;
                    _isReturning = true;
                }

                if (_targetIndex >= _enemyTargets.Count)
                    _targetIndex = 0;
            }
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
		
		.
		.
		.

        collision.GetComponent<EnemyController>()?.DoGetDamage();

		.
		.
		.

    }

    private void SwordStuck(Collider2D collision)
    {
        if (_pierceAmount > 0 && collision.GetComponent<EnemyController>() != null)
        {
            _pierceAmount--;
            return;
        }
           
		.
		.
		.
        
    }
}

 

단검 투척 스킬을 조작하기 위한 설정을 들고 있는 SkillThrowingSwordController 클래스의 경우

Pierce를 위한 추가사항 외에도 기존의 함수 구조 일부를 수정하였습니다.

 

새로운 프로퍼티를 추가하여 관통횟수를 기록하게 됩니다.

 

튕겨지는 단검을 설정하는 SetupBounceSword 메서드의 경우,

private으로 접근수준이 변경_enemyTargets초기화하기 위해 위와 같이 변경되었습니다.

 

SetupPierceAmount 메서드의 경우,

인자를 통해 SkillThrowingSwordController 클래스관통 프로퍼티 초기화합니다.

 

단검을 설정하는 SetupSword 메서드의 경우,

관통 횟수를 의미하는 프로퍼티0 이하일 경우 단검이 회전 애니메이션을 사용하도록 합니다.

 

Update 함수에서는 기존의 로직 일부SwordBounce 함수에서 수행하도록 구조를 변경하였습니다.

 

단검이 Trigger되는 경우 호출되는 OnTriggerEnter2D 함수에서는

Trigger 대상EnemyController 컴포넌트 유무에 따라 Damage 함수 수행하게 합니다.

 

단검이 적에게 박히는 경우 호출되는 SwordStuck 함수에서는 

관통 횟수가 남아있는 경우, 관통 횟수를 줄여가면서 단검이 박히지 않도록 조정합니다.

 

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

 

728x90
반응형