[Unity] 게임 따라 만들기(4)

정회민·2023년 4월 22일

유니티

물리 점프

저번 포스트에서 언급한대로 단발적인 입력에 한에서는 Update()에 적용하는 한다.

코딩

public class PlayerMove : MonoBehaviour
{
    public float jumpPower;
    
	void Update()
    {
    	// Jump
        if (Input.GetButtonDown("Jump") && !animator.GetBool("isJumping"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
            animator.SetBool("isJumping", true);
        }
    }
}

점프를 눌렀을 때 반응해야하고 이후 애니메이터에서 작업해줄 점프 상태가 False일 때 점프를 해야한다. 애니메이터 조건문을 빼고 코딩하면 무한 점프가 가능해진다.
JumpPower와 중력값, 공기저항을 적절하게 섞어서 적용해야 부드러운 동작이 가능하다.

ForceMode2D

ForceMode2D에서는 두가지 종류가 있다.
1. ForceMode2D.Impulse: 한번만 일시적으로 힘을 가하는 것.
2. ForceMode2D.Force: 연속적인 힘을 가하는 것.

착지

점프를 눌렀을 때 애니메이션을 변경하는 것은 전과 걷기를 설정했을 때와 동일하게 설정 가능하다. 단, 대기, 걷기, 점프 상태를 모두 이어주어야 된다

점프는 일회성이기 때문에 점프가 끝났을 때 상태변화를 적용해주지 않는다면 아래와 같이 애니메이션이 변경되지 않는다.

점프가 끝났을 경우에는 타일과 캐릭터의 충돌을 감지해주어야한다. 이는 FixedUpdate()에서 적용할 수 있다.

코딩

public class PlayerMove : MonoBehaviour
{
    void FixedUpdate()
    {
        // Landing Platform
        if (rigid.velocity.y < 0)
        {
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));
            RaycastHit2D raycastHit2D = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform"));
            if (raycastHit2D.collider != null)
                if (raycastHit2D.distance < 0.5f)
                    animator.SetBool("isJumping", false);
        }
        
    }
}

Debug.DrawRay로 Player에서 아래 방향으로 녹색 선 하나를 쏜다.
RaycastHit2D는 Ray에 닿은 오브젝트로 타일과의 충돌을 알아 낼 수 있는데 이때 LayerMask를 이용해 설정한 오브젝트와의 충돌만 감지할 수 있다.

참고로 raycastHit2D.collider.name을 이용해 충돌한 오브젝트가 무엇인지 확인할 수 있다.

LayerMask

타일을 LayerMask에 포함시켜주기위해 타일을 선택하고 Inspector에 "Platform" 레이어를 추가하고 적용해준다.

profile
Nest.js, Delphi 개발자

0개의 댓글