본문 바로가기

Unity/Small Project 따라하기

2. Player Jump

저번 포스트에 이어서 이번에는 Player의 점프를 구현해 보도록 하겠다.

 

1. 플레이어에 Character Controller 컴포넌트를 추가한다.

2. 점프 코드

public class Player : MonoBehaviour
{
    public float jumpPower = 10;
    public float gravity = -9.81f;
    float yVelocity;
    void Update()
    {

        // y속도는 중력을 계속 받아야 함.
        yVelocity += gravity * Time.deltaTime;
        // 만약 점프키를 누르면 y속도를 jumpPower로 함
        if (Input.GetButtonDown("Jump"))
        {
            yVelocity += jumpPower;
        }
        
        dir = Camera.main.transform.TransformDirection(dir); // 카메라가 바라보는 쪽으로 이동
        dir.y = 0;   
        dir.Normalize();
        Vector3 velocity = dir * speed;
        
        // 이동방향의 y속성에 y속도를 대입
        velocity.y = yVelocity;
    }
}

jumpPower는 점프의 힘 gravity는 중력 / 1초에 -9.81만큼 y의 값을 감소시킬 예정 /  yVelocity는 실제로 적용될 y의 속력이다. 

public class Player : MonoBehaviour
{
    public float speed = 5;

    public float jumpPower = 10;
    public float gravity = -9.81f;
    float yVelocity;
    void Update()
    {

        // y속도는 중력을 계속 받아야 함.
        yVelocity += gravity * Time.deltaTime;
        // 만약 점프키를 누르면 y속도를 jumpPower로 함
        if (Input.GetButtonDown("Jump"))
        {
            yVelocity += jumpPower;
        }


        // 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 앞뒤좌우 방향을 만들고 
        Vector3 dir = new Vector3(h, 0, v);
        
        // 방향(dir)을 카메라를 기준으로 변경
        dir = Camera.main.transform.TransformDirection(dir);
        dir.y = 0;   
        dir.Normalize();
        Vector3 velocity = dir * speed;
       

        // 이동방향의 y속성에 y속도를 대입
        velocity.y = yVelocity;

        // 그 방향으로 이동
        transform.position += dir * speed * Time.deltaTime;
    }
}

플레이어 스크립트에 넣어주고 제대로 되는지 플레이를 해보자.

점프는 제대로 되지만 플레이어가 땅을 뚫고 떨어진다. 이유는 yVelocity에 gravicty의 값을 계속 더해서 (-9.81)  transform.position 으로 아래로 계속 움직이기 때문이다. 이때 Charater Controller에 Collider가 있는데 왜 아래로 떨어지냐고 할 수 있는데, transform.position 은 물리법칙을 무시하고 이동하기 때문이다.

 

 

transform.position += dir * speed * Time.deltaTime;
  cc.Move(dir * speed * Time.deltaTime);

이동하는 코드를 transform.position에서  cc.Move로 수정한다. 이후 실행해보면 떨어지지 않는 걸 확인할 수 있다.