본문 바로가기

Unity/Small Project 따라하기

3. Player Jump 2

 

땅에 붙어있어도 gravity값이 계속해서 yVelocity에 더해지기 때문에 아래로 이동할 때 순간이동 하듯이 빠르게 움직이는 걸 볼 수 있다. 

 

따라서 땅에 있을 때는 yVelocity를 초기화 해줘야 한다. 이때 Character Controller에는 땅에 닿아 있는지 확인 할 수 있는 기능이 있는데 CharacterController.isGrounded 이다. 그래서 조건에 isGrounded가 true라면 yVelocity를 0으로 초기화해줬다. 

 

추가적으로 2단 점프를 구현하고 싶었기에 점프를 할 때마다 jumpCount 의 값을 1씩 올리고 maxJumpCount 에 2의 값을 넣어 jumpCount가 MaxJumpCount 보다 작을 때만 점프를 할 수 있게 했다. 마찬가지로 땅에 닿았을 때 jumpCount의 값을 초기화 해줬다.

 

public class Player : MonoBehaviour
{
    CharacterController cc;

    public float speed = 5;
    public float jumpPower = 10;
    public float gravity = -9.81f;
    float yVelocity;


    int jumpcount;
    int maxJumpCount = 2;
    private void Start()
    {
        cc = GetComponent<CharacterController>();
    }
    void Update()
    {


        // 만약 공중이라면
        if (cc.isGrounded)
        {
            // 땅에 서 있다면 점프 횟수를 0으로 초기화
            jumpcount = 0;
            yVelocity = 0;
        }
        else
        {
            // 공중이라면
            // 속도는 중력을 받아야함
            yVelocity += gravity * Time.deltaTime;
        }

        // 만약 점프키를 누르면 y속도를 jumpPower로 함
        if (jumpcount < maxJumpCount && Input.GetButtonDown("Jump"))
        {
            yVelocity += jumpPower;
            jumpcount++;
        }


        // 사용자의 입력에 따라
        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;

        // 그 방향으로 이동
        cc.Move(velocity * Time.deltaTime);
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Vector3 from = transform.position;
        Vector3 to = transform.position + Vector3.up * yVelocity;
        Gizmos.DrawLine(from, to);
    }
}