또 새로운 프로젝트의 시작이다.
이번에는 2D플랫포머에서의 점프에 대해서 생각해보자
윗 블럭이 통과가 불가능한 블럭이 아니라면 점프를 통해 아래에서 위로 점프를 통해 통과할 수 있으며
밑 점프를 통해 블럭에서 아래로 이동이 가능하게 구현해야한다.
우선은 OnGround라는 함수를 만들어 이 캐릭터가 땅에(선택된 레이어에 포함된 게임오브젝트) 위에 있는지
확인해야한다.
private bool OnGround()
{
//Todo : 캐릭터 스프라이트 정해지고 나서 레이 갯수를 늘려서 스프라이트 끝에서 끝까지
RaycastHit2D hit = Physics2D.Raycast(new Vector2(Player.transform.position.x, Player.transform.position.y - 1f), Vector2.down, 0.5f, Platform);
if (hit.collider?.gameObject.layer == 7)
{
return true;
}
else return false;
}
우선은 간단하게 만들었다.
그리고 점프를 구현해서 OnGround가 true라면 점프가 가능하게끔 했다.
private void Jump()
{
if(OnGround() == true)
{
Player.Rigidbody.AddForce(Vector2.up * JumpPower, ForceMode2D.Impulse);
}
}
다음은 점프 로직인데
private IEnumerator CoPlayerChecker()
{
while (true)
{
if (Player.Rigidbody.velocity.y > 0)
{
Player.Collider.isTrigger = true;
}
else if (_downJump == true)
{
yield return wait;
_downJump = false;
}
else if (Player.Rigidbody.velocity.y < 0 && _downJump == false)
{
Player.Collider.isTrigger = false;
}
yield return null;
}
}
플레이어의 리지드바디 의 y값이 +라면 위로 상승 중
-라면 하강 중 일것이다.
isTrigger를 체크하면 콜라이더의 부딪히는 기능은 사라지고 해당 영역에 닿는 것만 반환하는 기능을 이용해서
플레이어를 투과 상태로 만들어주었다.
private void DownJump()
{
if(OnGround() == true)
{
Player.Collider.isTrigger = true;
_downJump = true;
}
}
밑 점프도 마찬가지
실행해보자.
추후의 개선점으로는 가장 밑바닥에 있는 땅도 Platform 레이어라면 심연으로 빠지게되고
통과 불가능한 벽의 경우에도 velocity.y의 값이 양수인 경우에는 통과하게 된다.
가장 밑바닥의 땅 레이어를 검사하는 기능을 추가하고
통과 불가능한 벽 또한 레이어를 통해 OnCollision2D를 이용하여 is trigger를 해제해주는 방향으로 만들면 될 것 같다.
TTE
1120 TIL - 프로퍼티 (0) | 2024.11.20 |
---|---|
1119 TIL - 플랫포머 플레이어 이동 2 (0) | 2024.11.19 |
1112 TIL - 개인 프로젝트 진행 중 (0) | 2024.11.12 |
1107 TIL - 팀 프로젝트 완료 (0) | 2024.11.07 |
1030 TIL - C# 제네릭 싱글톤 (0) | 2024.10.30 |