[Unity] 유니티 게임개발

[Unity: 유니티 게임 개발] Player - 플레이어 점프시키기

ddgoori 2022. 12. 14. 14:35

*M2에서 유니티 돌리니까 뜨거워서 노트북이 폭발하려고 한다.^^ M2는 Fan이 내장되어 있지 않아서 뜨거우면 느려진다. ㅎㅎ 그래서 뜨겁지 않게 설계해놓은 것인데,, 무거운 프로그램 돌리면 뜨거워지는 것은 어쩔수가 없구만..!! 유니티 돌리면서 블로그를 쓰려니 정말 느리다 ㅋㅋ M1 Pro Max를 살 걸 그랬나 하는 후회를 잠시 해본다. 하지만 M2 성능에 지금 이렇게 유니티로 간단한 프로젝트도 버벅거릴지 몰랐네 ㅠㅠ (아 물론 유니티만 할 때는 버벅거리지 않는다.. 블로그에 일지 쓰면서 하려니 느려진다.)

 

 Player - 플레이어 점프시키기

 
GetButtonDown이 Jump이면 점프한다는 뜻. 스페이스
    void Update()
    {
        // y는 안변하고 x만 변하게 하는 코드
        theRB.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, theRB.velocity.y);

        // 점프
        if(Input.GetButtonDown("Jump")) {
            theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
        }
    }

 

위 처럼 작성하면 점프는 되지만! 영원히 점프하게 됨(캐릭터가 끝없이 위로 올라감)

AddLayer를 하고 Ground 레이어를 만들어준다.

 

Tilemap의 Layer에 방금 만든 Ground를 넣어준다. 

 

Player 하단에 Object를 만들어 Ground Check Point를 만들어주고 포인트를 캐릭터의 발끝으로 이동시켜준다.

 

모든 오브젝트는 Transform이 있다. 이 Transform을 통해 그라운드에 캐릭터가 있는지 없는지 확인한다. private으로 만든 이유는 인스펙터에서 조정할 필요가 없고 코드로만 만들것이기 때문이다. LayerMask는 어떤 레이어를 우리가 쓸지 확인하는 것이다. 아래 코드를 작성해준다.

    public Transform groundPoint;
    private bool isOnGround;
    public LayerMask whatIsGround;

    void Update()
    {
        // y는 안변하고 x만 변하게 하는 코드
        theRB.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, theRB.velocity.y);

        isOnGround = Physics2D.OverlapCircle(groundPoint.position, .2f, whatIsGround);

        // 점프
        if(Input.GetButtonDown("Jump") && isOnGround) {
            theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
        }
    }

 

위 코드를 저장하고 유니티로 돌아오면 컴파일 되어서 Player Controller가 인스펙터에 생긴다. GroundPoint에 위에서 만들어둔 Ground Check Point를 선택해주고 What is Ground에 Ground를 선택한다. 그럼 캐릭터가 무한 점프하는 것이 아니라 그라운드에 있을 때만 점프가 된다.

 

*  더 자세한 수치들을 보기 위해서는 워크스페이스 우측 상단의 더보기란에서 Debug모드로 전환한다.