유니티2D 점프구현(feat. 중력, Laycast , 무한점프 막기)

JHO·2022년 9월 20일
5

유니티 2D

목록 보기
5/8

1. 점프구현


1-1. 기본 점프 소스코드

public float jumpPower;
void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
        }
    }
  • 버튼의 연속적이 아닌 단발적인 사용으로, Update()에다가 작성.
    - GetButtonDown을 이용해 "Jump"버튼을 누를 때, 물리적으로 힘을 가하는 함수인 AddForce()을 이용해 원하는 크기의 점프구현.

2-1. 중력 크기 적용

  • 첫 번째, Edit - Project Settings - Gravity에서 Y값에 원하는 크기를 입력.
  • 기본적으로 -9.81이 적용돼있음.
  • 두 번째, Rigidbody 2D 의 Gravity Scale에서 오브젝트에 적용되는 중력 비율을 적용가능.
  • 1이면 100%적용, 그 이하면 작게 적용, 그 이상이면 더 크게 적용.
    (Gravity Scale : 1인 떨어지는 모습)
    (Gravity Scale : 4인 떨어지는 모습)

2. 점프 애니메이션 구현


2-1. 애니메이터

  • 먼저, 원하는 객체에 점프 애니메이션을 만든 뒤, 애니메이터에 들어감.
  • 위의 사진처럼 State 끼리 Make Transition을 통해 엮어줌.
  • isJumping이라는 bool 변수를 만들어 각 transition에 위의 사진처럼 Conditions에 추가하여 true/false 상태 조정.
  • (예시)
    Walk -> Jump = iswalking : true , isjumping : true
    Jump -> Walk = iswalking : true , isjumping : false
    Idle -> Jump = iswalking : false , isjumping : true
    Jump -> Idle = iswalking : false , isjumping : false

2-2. Loop Time

  • 참고로, 적용한 점프 애니메이션이 반복을 시키면 이상하므로 Loop Time을 false.

2-3. 애니메이션 적용 소스코드(feat. Raycast)

void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            anim.SetBool("isjumping", true);
        }
    }
void FixedUpdate()
    {
        //Landing Ploatform
        if(rigid.velocity.y < 0) //내려갈떄만 스캔
        {
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));
            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform"));
            if (rayHit.collider != null)
            {
                if (rayHit.distance < 0.5f)
                {
                    anim.SetBool("isjumping", false);
                }
            }
        }
    }
  • DrawRay(시작점, 쏘는방향, 색깔) : 에디터 상에서만 Ray(빔)을 그려주는 함수
  • RayCastHit : Ray에 닿은 오브젝트, Ray는 물리기반이라 Physics2d에 있음.
  • GetMask() : 레이어 이름에 해당하는 정수값 리턴.
    Raycast 인자로 넣는 순간, 입력한 레이어에 해당한 것들만 Ray로 스캔하겠다는 의미.
  • Raycast(시작점, 쏘는방향, 거리(원할때), LayerMask(원할때)) : 빔을 쏘는 함수.
  • RayCastHit변수의 콜라이더로 검색 확인 가능.
  • 맨위에 있는 기본 점프 소스코드에다 점프할때마다 isjumping을 true로 반환하는 코드 적용.
  • rigid.velocity.y < 0 일때 작동하는 조건을 넣어, 점프하고 난 뒤, 내려 올때 Ray를 쏘아 platform과의 거리가 0.5아래면 isjumping을 false로 변환하여 점프 애니메이션에서 걷고있거나 정지한 상태의 애니메이션으로 넘어가게끔 함.
    (모든 Floor에 Platform 이라는 Layer을 적용한상태)
    (Platform이라는 Layer을 적용한 object만 스캔하는 모습)

3. 무한 점프 방지


void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump") && !anim.GetBool("isjumping"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            anim.SetBool("isjumping", true);
        }
    }
  • 2-3의 코드에서 조건에 isjumping이 false일 때만 즉, 점프하고있지않는 상태에서만 점프할 수 있게 and로 묶어줌.
    (전체적으로 점프, 멈춤, 걷기 애니메이션이 순환되는 모습)

<참고>
골드 메탈님 강의 영상:https://www.youtube.com/watch?v=2SikOdH7xvQ&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2&index=18

사용한 텍스처 소스 : http://u3d.as/2mvJ (by골드메탈님)

profile
개발노트

0개의 댓글