전 포스팅에서 이동관련 함수들을 알아봤는데요. 여러가지 방법이 사용될 수 있다는 것을 알았습니다.
마찬가지로 점프도 다양한 방법이 있겠지만 여기서는 Rigidbody.AddForce, Rigidbody.velocity를 사용해보겠습니다.
점프를 구현하기 위한 과정
1. 애니메이터 설정
2. 레이캐스트로 땅과 충돌 체크
3. 점프하기
애니메이터 설정
점프 애니메이션이 없다면 이 과정은 생략해도 됩니다.
Idle과 Jump, Run과 Jump에 Transition을 생성해줍니다.
파라미터에 Bool로 jumping을 선언해줍니다.
애니메이션 전환 조건을 밑의 그림에 따라 설정해줍니다.
애니메이터 설정은 끝났습니다.
Has Exit Time, Settings 부분은 조금 있다가 직접 점프를 눌러보면서 수정해도 늦지 않습니다.
참고용 Has Exit Time, Settings
저는 점프 관련된 Transition을 위와 같이 통일했습니다.
딱히 정답이 없으므로 원하는 수치만큼 조절하셔도 됩니다.
레이캐스트로 땅과 충돌 체크
jumping 변수를 false로 만들기 위해서는 캐릭터가 땅과 맞닿았는지 알 수 있어야 합니다.
OnColliderEnter로 구현해도 됩니다만, 개인적으로 반응이 살짝 느린 느낌이 들어서 레이캐스트를 사용했습니다.
보이지 않는 레이저를 쏴서 충돌체와 교차했는지 알 수 있게 합니다.
땅과 충돌을 체크할 때는 Raycast만으로는 부족하기 때문에 Boxcast를 사용해야 합니다.
Raycast
Boxcast
부착된콜라이더 col2D;
void Start()
{
col2D = GetComponent<부착된콜라이더>();
}
void Update()
{
RaycastHit2D raycastHit = Physics2D.BoxCast(col2D.bounds.center, col2D.bounds.size, 0f, Vector2.down, 0.02f, LayerMask.GetMask("Ground"));
if (raycastHit.collider != null)
animator.SetBool("jumping", false);
else animator.SetBool("jumping", true);
}
Boxcast 형식
public static RaycastHit2D BoxCast(Vector2 origin, Vector2 size, float angle, Vector2 direction, float distance = Mathf.Infinity, int layerMask, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity )
origin |
시작지점 |
size |
박스의 크기 |
angle |
박스의 각도 |
direction |
박스의 방향 |
distance |
박스의 최대 거리 |
layerMask |
특정 레이어에서만 충돌확인 |
자세한 설명은 레퍼런스를 확인해주세요.
Collider의 Bounds 레퍼런스입니다.
Layer Mask 설정
Ground를 적습니다.
땅 오브젝트의 Layer를 바꿉니다.
int layerMask에 레이어 번호 8을 쓰면 안됩니다.
1 << 8
혹은
1 << LayerMask.NameToLayer("Ground")
혹은
LayerMask.GetMask("Ground")
이렇게 사용해야 합니다.
여러 개의 레이어를 포함하는 방법
layerMask = LayerMask.GetMask("Ground") | LayerMask.GetMask("Enemy") | ... ;
점프하기
충돌 체크까지 완료했다면 이제 점프하는 것만 남았습니다.
public float jumpPower = 40;
bool inputJump = false;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && !animator.GetBool("jumping"))
{
inputJump = true;
}
}
void FixedUpdate()
{
if(inputJump)
{
inputJump = false;
rigid2D.AddForce(Vector2.up * jumpPower);
//rigid2D.velocity = new Vector2(rigid2D.velocity.x, jumpPower);
}
}
전 포스팅에서 설명했듯이 Update에서 키 입력을 받고 FixedUpdate에서 물리적 처리를 해야 합니다. AddForce와 velocity중 원하는 방식으로 점프를 하시면 됩니다.
추가로 점프 후 빨리 떨어뜨리기 위해 소드맨의 Rigidbody의 Gravity Scale을 1.7로 수정했습니다.
실행 화면
moveSpeed가 5이상일 때 벽에 붙어서 점프하면 끼인 듯 멈춰버립니다.
마찰력 문제인데요.
다음 포스팅에서 이 문제를 해결해보겠습니다.
'유니티 게임 개발' 카테고리의 다른 글
[유니티 강좌] 2D RPG 게임 만들기 - 9 / 맵 생성, 타일 맵 (6) | 2021.03.18 |
---|---|
[유니티 강좌] 2D RPG 게임 만들기 - 8 / 벽에 붙는 현상 (3) | 2021.03.15 |
[유니티 강좌] 2D RPG 게임 만들기 - 6 / Translate의 문제점과 대안 (8) | 2020.06.06 |
[유니티 강좌] 2D RPG 게임 만들기 - 5 / 적 공격하기 (69) | 2020.05.23 |
[유니티 강좌] 2D RPG 게임 만들기 - 4 / 적과 체력바 만들기 (41) | 2020.05.11 |
댓글