이번 포스트에서는 단검의 여러 상태 중에서 회전하는 단검을 구현해보도록 하겠습니다.
추가적으로 튕기는 단검에서 단검이 튕겨질 때 적에게 피해를 주지 않던 현상도 수정하겠습니다.
1) 문제 수정 - SkillThrowingSwordController
날라가는 단검과 캐싱된 적의 거리가 0.1보다 작다면
캐싱된 적의 EnemyController 컴포넌트를 가져와 DoGetDamage 함수를 호출함으로써
문제를 해결할 수 있습니다.
2) 회전하는 단검 - SkillThrowingSword
public class SkillThrowingSword : SkillTemplate
{
.
.
.
[Header("Spint Info")]
[SerializeField]
private int _maxTravelDistance;
[SerializeField]
private float _spinDuration;
[SerializeField]
private float _spinGravity;
[SerializeField]
private float _hitCooldown = 0.35f;
.
.
.
private void SetupSwordGravity()
{
if (_swordType == SwordType.Bounce)
_swordGravity = _bounceGravity;
else if(_swordType == SwordType.Pierce)
_swordGravity = _pierceGravity;
else if(_swordType == SwordType.Spin)
_swordGravity = _spinGravity;
}
.
.
.
public void CreateSword()
{
.
.
.
if (_swordType == SwordType.Bounce)
throwingSwordController.SetupBounceSword(true, _bounceAmount);
else if (_swordType == SwordType.Pierce)
throwingSwordController.SetupPierceSword(_pierceAmount);
else if (_swordType == SwordType.Spin)
throwingSwordController.SetupSpinSword(true, _maxTravelDistance, _spinDuration, _hitCooldown);
.
.
.
}
.
.
.
}
단검 투척 스킬을 그 자체를 의미하는 클래스 SkillThrowingSword에 회전을 위한 프로퍼티를 추가합니다.
각각 순서대로 회전하는 단검이 갈 수 있는 최대 거리 / 회전 기간 / 회전하는 단검의 중력 / 피해 주기입니다.
단검의 타입 별 중력을 설정하는 SetupSwordGravity에서는
회전하는 단검을 위한 중력을 설정하도록 로직을 추가합니다.
단검을 생성하는 CreateSword 메서드에서는
회전하는 단검의 타입에 맞춰 SkillThrowingSwordController의 SetupSpinSword 함수를 호출합니다.
3) 회전하는 단검 - SkillThrowingSwordController
public class SkillThrowingSwordController : MonoBehaviour
{
.
.
.
[Header("Spin Info")]
private float _maxTravelDistance;
private float _spinDuration;
private float _spinTimer;
private bool _wasSpinStopped;
private bool _isSpinning;
private float _hitTimer;
private float _hitCooldown;
private float _spinDirection;
.
.
.
public void SetupSpinSword(bool isSpinning, float maxTravelDistance, float maxDuration, float hitCooldown)
{
_isSpinning = isSpinning;
_maxTravelDistance = maxTravelDistance;
_spinDuration = maxDuration;
_hitCooldown = hitCooldown;
}
public void SetUpSword(Vector2 dir, float gravityScale, PlayerController player)
{
.
.
.
_spinDirection = Mathf.Clamp(_rigidBody2D.velocity.x, -1, 1);
}
.
.
.
private void Update()
{
.
.
.
SwordBounce();
SwordSpin();
}
private void SwordSpin()
{
if (_isSpinning)
{
if (Vector2.Distance(_playerController.transform.position, transform.position) > _maxTravelDistance && !_wasSpinStopped)
{
StopWhenSpinning();
}
if (_wasSpinStopped)
{
_spinTimer -= Time.deltaTime;
transform.position = Vector2.MoveTowards(
transform.position,
new Vector2(transform.position.x + _spinDirection, transform.position.y),
1.5f * Time.deltaTime
);
if (_spinTimer < 0)
{
_isReturning = true;
_isSpinning = false;
}
_hitTimer -= Time.deltaTime;
if (_hitTimer < 0)
{
_hitTimer = _hitCooldown;
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 1);
foreach (Collider2D hit in colliders)
{
hit.GetComponent<EnemyController>()?.DoGetDamage();
}
}
}
}
}
private void StopWhenSpinning()
{
_wasSpinStopped = true;
_rigidBody2D.constraints = RigidbodyConstraints2D.FreezePosition;
_spinTimer = _spinDuration;
}
.
.
.
private void OnTriggerEnter2D(Collider2D collision)
{
if (_isReturning)
return;
collision.GetComponent<EnemyController>()?.DoGetDamage();
SetupTargetsForBounce(collision);
SwordStuck(collision);
}
.
.
.
private void SwordStuck(Collider2D collision)
{
.
.
.
if (_isSpinning)
{
StopWhenSpinning();
return;
}
.
.
.
}
}
단검 투척 스킬을 조작하는
클래스 SkillThrowingSwordController에 회전을 위한 여러 프로퍼티를 추가합니다.
Header 속성의 영향 밖에 있는 프로퍼티들은 타격 주기와 회전하면서 이동하는 방향 설정에 사용합니다.
메서드 SetupSpinSword에서는 인자들을 받아 회전에 필요한 여러 프로퍼티들을 초기화합니다.
단검을 설정하는 메서드 SetupSword에서는
회전하는 단검이 이동하기 위한 방향을 설정하는 프로퍼티를 초기화합니다.
Update 메서드에서는 기존의 튕기는 단검의 로직을 새로운 함수 SwordBounce로 사용합니다.
이 변경점은 회전하는 단검에도 마찬가지로 적용하여 사용합니다.
회전하는 단검의 로직을 수행하는 메서드 SwordSpin의 경우,
여러 조건을 판단하여 회전하는 단검의 범위안에 있는 적들에게 일정 간격마다 피해를 주게 됩니다.
메서드 StopWhenSpinning의 경우,
단검이 회전하는 동안 단검의 이동을 막는 용도로 사용합니다.
메서드 SwordBounce에서 기존에 튕기는 단검의 로직 일부를
함수 SetupTargetsForBounce로 수행하도록 코드 구조를 수정하였습니다.
단검이 박히는 경우 호출하는 메서드 SwordStuck에서는
단검이 회전하는 동안 단검이 박히지 않도록 로직을 수행합니다.
최종 수행 결과는 다음과 같습니다.
'유니티 > 게임 프로젝트' 카테고리의 다른 글
2D RPG - (15 - 9) 단검 투척 스킬 구현_09 (0) | 2025.02.06 |
---|---|
2D RPG - (15 - 7) 단검 투척 스킬 구현_07 (0) | 2025.02.05 |
2D RPG - (15 - 6) 단검 투척 스킬 구현_06 (0) | 2025.02.05 |
2D RPG - (15 - 5) 단검 투척 스킬 구현_05 (0) | 2025.02.04 |
2D RPG - (15 - 4) 단검 투척 스킬 구현_04 (0) | 2025.01.29 |