본문 바로가기

유니티 2D 기본(Platformer Game)

4. 플레이어 점프 구현 & Raycast

public float jumpPower;
void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump")){
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
        }
    }

공기저항 때문에 낙하 속도가 조금 느립니다. 이를 빠르게 낙하하도록 조정해보겠습니다.

점프 낙하 속도 빠르게 조절

1. Project Setting -> Gravity y

Default 값은 -9.81로 값이 커질 수록 중력이 세집니다.

2. Gravity Scale 

중력을 몇배로 받을 것인지 값으로 정합니다.

 

점프 애니메이션

1. 애니메이션 Transition 연결

2. 애니메이션 변경 조건이 될 변수 생성(bool 타입)

3. Conditons 추가

4. 스크립트 작성

public float jumpPower;
void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump")){
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            anim.SetBool("isJump", true);
        }
    }

 

5. Loop와 Speed 수정

점프의 경우 Loop 해제


이중점프 방지

GetBool 함수로 isJump변수의 bool값을 가져왔을때, true라면 점프중이니, false일때만 점프가능하게 조정.

public float jumpPower;
void Update()
    {
        //Jump
        if (Input.GetButtonDown("Jump") && !anim.GetBool("isJump")){
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            anim.SetBool("isJump", true);
        }
    }

 

바닥 착지 후 isJump를 false로 되돌리기

Raycast로 바닥 착지 인식하기

 

RayCast : 오브젝트 검색을 위해 Ray를 쏘는 방식

DrawRay() : 에디터 상에서만 Ray를 그려주는 함수

RayCastHit : Ray에 닿은 오브젝트

LayerMask : 물리 효과를 구분하는 정수값

GetMask() : 레이어 이름에 해당하는 정수값을 리턴하는 함수

distance : Ray에 닿았을 때의 거리

 

DrawRay(Ray 그려지기 시작하는 위치, Ray가 그려지는 방향, 색상)

Raycast(Ray 그려지기 시작하는 위치, Ray가 그려지는 방향, 길이, 정수 타입 레이어 필터링 넘버)

 

스크립트

void FixedUpdate(){
	    //Landing Platform
        if(rigid.velocity.y < 0) // 플레이어가 낙하중일 때 == velocity.y가 음수
        {
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0)); //ray를 그리기
            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform")); //ray 쏘기
            if (rayHit.collider != null) { // RayCastHit 변수의 콜라이더로 검색 확인 가능
                if (rayHit.distance < 0.5f) { // ray가 0.5 이상 들어갔을 때
                    anim.SetBool("isJump", false); // 애니메이션 되돌리기
                }
            }
        }
}

 

Layer 만들기

Add Layer -> Layer 이름 작성 -> 사용

 

결과