카테고리 없음
Unity 2D 팀 프로젝트 - 3
danpat77
2025. 2. 26. 20:30
Untiy 2D 팀 프로젝트 궁수의 전설 래퍼런스 작품 만들기 - 3
오늘로 팀 프로젝트가 4일차가 진행 되었다. 오늘은 액티브 스킬로 대쉬 기능을 한번 추가해보았다.
우선 대쉬에 필요한 변수들을 먼저 선언해 주
[Header("Dash")]
private Rigidbody2D rb;
private bool isDashing;
//대쉬 거리는 playerStat에 있음
private float dashDuration = 0.2f; // 돌진 지속 시간
private float dashCooldownTime = 3f; // 대시 기본 쿨타임
private float dashCooldownTimer = 0f; // 쿨타임 타이머
public bool isDashReady = true; // 쿨타임이 끝났는지 체크
코루틴을 사용하여 대쉬로직을 돌려준다
private IEnumerator DashCoroutine() // 대쉬 코루틴
{
isDashing = true;
// 바라보는 방향으로 돌진
Vector2 startPosition = rb.position;
Vector2 dashDirection = GetComponent<PlayerController>().LookDirection.normalized; //대쉬 방향
Vector2 targetPosition = startPosition + dashDirection * playerStat.DashDistance; // 대쉬 도착 지점
// 대시 중 벽에 충돌하는지 확인하기 위한 레이캐스트
RaycastHit2D hit = Physics2D.Raycast(startPosition, dashDirection, playerStat.DashDistance, LayerMask.GetMask("Wall"));
if (hit.collider != null)
{
// 충돌이 발생한 경우, 벽과 충돌 지점까지 대시를 멈추고, 그 지점에서 0.2만큼 짧은 거리로 대시
targetPosition = hit.point - dashDirection * 0.2f;
}
float elapsedTime = 0f;
while (elapsedTime < dashDuration)
{
rb.position = Vector2.Lerp(startPosition, targetPosition, elapsedTime / dashDuration);
elapsedTime += Time.deltaTime;
yield return null;
}
rb.position = targetPosition; // 대시 종료 후 위치 보정
isDashing = false;
isDashReady = false;
}
여기서 Raycast를 사용한 이유는 대쉬를 할때 앞에 벽이나 장해물이 있을때 뚫고 지나가는 현상을 방지하기 위해 Raycast를 사용하여 대쉬의 길이가 장해물을 넘어가지 못하게 만들었다.
이제 대쉬를 사용했으니 쿨타임을 구연을 해주자
public void DashCoolDown()
{
dashCooldownTimer += Time.deltaTime;
if (dashCooldownTimer >= dashCooldownTime)
{
dashCooldownTimer = 0f;
isDashReady = true;
}
}
deltaTime을 사용하여 타이머값을 올려주고 타이머 값이 쿨타임 값이랑 같아지면 초기화 후 isDashReady를 true로 바꿔준다.
마지막으로 작성한 코드들을 호출해주면 끝
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
if (!isDashReady) DashCoolDown();
}
public void StartDash()
{
if (!isDashing && isDashReady) StartCoroutine(DashCoroutine());
}
이제 StartDash()를 플레이어 조작 스크립트에서 호출을하거나 input함수를 사용하여 호출 시키면 대쉬가 작동을 한다.