https://www.youtube.com/watch?v=2kFGmuPHiA0
미리보는 결론 : 점프나 공격시에 y축을 고정 혹은 자유롭게 다루고 싶다면 graviityScale을 0으로 만들어 중력을 없애라!
●대쉬를 구현 하는데 어려움이 있었다.
- Addforce 를 순간적으로 줄지 << 자연스럽지 않음
- 공격 판정을 리지드바디를 false로 해서 피할지 << 지형을 뚫어버려서 기각
●이러한 것을 한번에 해결해줄 영상이 있어서 글을 쓰게 되었다. (한국어로도 찾아볼 수 있게...)
●단순히 변수와 구현방법만 보여드리고 설명 드리겠다. (구현 로직은 영상을 시청해주세요)
●코드 전문
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
private bool canDash = true;
private bool isDashing;
private float dashingPower = 20f;
private float dashingTime = 0.2f;
private float dashingCooldown = 1f;
...
if (Input.GetKeyDown(KeyCode.C) && canDash)
{
StartCoroutine(Dash());
}
...
//무적 판정 아직 없음
private IEnumerator Dash()
{
canDash = false;
isDashing = true;
float originalGfavity = playerRigidbody.gravityScale;
playerRigidbody.gravityScale = 0f;
if (dir.x == 0)
dir = Vector2.right;
playerRigidbody.velocity = new Vector2(dir.x * dashingPower, 0f);
yield return new WaitForSeconds(dashingTime);
playerRigidbody.gravityScale = originalGfavity;
isDashing = false;
yield return new WaitForSeconds(dashingCooldown);
canDash = true;
}
}
●
우선 Dash를 코루틴으로 생성과 함께 동시 실행을 걸어준다. 대쉬는 Time.deltatime만큼 되는것이 아닌 변수 dashingTime 만큼 실행되어야 하기 때문이다.
임의로 c가 눌렸을 때 실행 된다. (canDash는 쿨타임이 아니라면 true이다.)
if (Input.GetKeyDown(KeyCode.C) && canDash)
{
StartCoroutine(Dash());
}
●Dash를 하고 있음을 알수 있게 canDash(쿨타임 계산용), isDash(동작 상태 관리용)을 초기화 해준다.
private IEnumerator Dash()
{
canDash = false;
isDashing = true;
●대쉬중에는 Y축이 변하지 않게 하기 위해 중력을 제거한다.
그 전에 원래의 중력(GravityScale) 값을 변수에 저장한다.
float originalGfavity = playerRigidbody.gravityScale;
playerRigidbody.gravityScale = 0f;
●가만히 서있을 때의 대쉬 방향을 정해주는 코드이다
//영상에는 없는 내가 조정한 코드
if (dir.x == 0)
dir = Vector2.right;
●속력을 수정, 그리고 dashingTime 후에 종료한다.
playerRigidbody.velocity = new Vector2(dir.x * dashingPower, 0f);
yield return new WaitForSeconds(dashingTime);
●player의 중력을 돌려 놓고 isDashing을 false로 한다.
단, 쿨타임 계산을 위해 canDash는 new WaitForSeconds(dashingCooldown); 를 통해 dashingCooldown 후에 true로 초기화 한다.
playerRigidbody.gravityScale = originalGfavity;
isDashing = false;
yield return new WaitForSeconds(dashingCooldown);
canDash = true;
●결과
●감상
1.
코루틴을 안써봐서 어색하긴 했지만 쓰는 법은 쉬웠다.
하지만 어쩔 떄에 써야할지는 모르겠으므로 공부가 더 필요할 것 같다.
2.
y축에 velocity 를 0으로 만들어서 고정을 하려 했는데, 그냥 유니티에서 중력을 없애면... 어... 대쉬중에 적을 만나면 밀어버리려나..? 그럼 돌진시에 콜라이더를 비활성화하면 되나? 고민해봐야겠다.
'게임개발 > 유니티_문제해결' 카테고리의 다른 글
플레이어가 타일 맵에서 벗어날 때. (0) | 2023.05.24 |
---|---|
[유니티_문제해결] 애니메이션이 두 번 재생 되는 경우 (0) | 2023.05.18 |
[유니티_문제해결] 애니메이션 동작 중 다시 실행 (버그) (0) | 2023.04.06 |