[Unity] 프로젝트 생성 및 캐릭터 조작 (+애니메이션) (2)

이준석·2021년 1월 17일
1

Unity

목록 보기
3/4
post-thumbnail

오늘은 저번 시간에 이어서 캐릭터 점프를 작성해볼 예정이다. 😀😀

그리고 추가로 왼쪽으로 이동할 때는 왼쪽을 바라보고 오른쪽으로 이동할 때는 오른쪽을 바라보도록 추가도 해보도록 하자.

그리고는 걷는 애니메이션과 점프 애니메이션까지 다 하면 캐릭터와 관련된 작업은 마치게되고 이를 응용하면 보다 더 멋진 캐릭터 조작을 만들 수 있을 것으로 생각된다.

5. 캐릭터 점프

우선 점프를 하기 전에 플랫폼(=지형)에 마찰력을 줄이도록 해보자 (왜 하는지는 아직 잘 모르겠다. 기초 부분은 생략해서 그런건가...😓😓)

프로젝트 빈 공간에 오른쪽 클릭을 해서 Create > Physics Material 2D를 눌러서 생성해준다.

그리고 난 후 Friction(=마찰력), Bounciness(=탄성력) 두 개를 조절할 수 있는데 Friction 부분을 0으로 줄여준다.

그러고 플레이를 해보면 마찰력이 0이기 때문에 플레이어가 조금씩 옆으로 이동하게 되는데, 이 부분을 캐릭터의 중력과 공기 저항값을 설정해주면 어느 정도 해결이 될 것이다.

그 다음으로 캐릭터가 점프를 할 수 있도록 코딩을 해보도록 하자.

일전에 만들어 두었고, 플레이어에 넣어둔 스크립트 파일을 더블 클릭을 통해서 열어준다.

그리고는 FixedUpdate 부분에 다음과 같이 코딩을 적어준다.

캐릭터 점프를 구현하는 코딩

이와 같이 코딩을 작성하면 캐릭터가 점프를 할 수 있게 되는데, GetButtonDown("Jump")는 Space 바로 디폴트 설정이 되어있고, rigid는 캐릭터에 적용된 RigidBody2D이고 거기다가 힘을 가해서 단위벡터 값인 Vector2.up를 설정해 위쪽으로 힘이 가해질 수 있도록 한다.

그리고 jumpPower를 public 전역변수로 설정해서 유니티창에서 값을 입력할 수 있도록 한다.

이렇게 코딩을 하고 유니티에서 간단하게 설정을 맞추면 다음과 같이 작동한다.

🟡 내 설정은 Gravity Scale = 1 / Linear Drag = 2 / jumpPower = 12 (참고용)

스페이스바를 눌러보면 정상적으로 점프를 하는 것을 볼 수 있다.
캐릭터가 점프는 하는데 약간 석연치 않은 부분들이 많다.

🟡 첫째로, 점프를 한 뒤에 내려오는 속도가 너무 느리다.

🟡 둘째로, 스페이스바를 계속 누르면 무한 점프가 가능해진다.

하지만 보통의 플랫포머 게임이라면 점프는 한 번에 내려오는 속도 또한 빠르게 내려올 것이다.

따라서 점프 후 캐릭터가 하강하는 속도를 빠르게 하기 위해서는 플레이어의 Gravity Scale 값을 조절해주면 된다.

그리고 무한 점프 부분을 해결하기 위해서는 애니메이션 작업을 하면서 해결해보도록 하자.

6. 걷기 및 점프 애니메이션

그 전에 아틀라스에 대한 설명을 해주려고 했으나, 유튜브를 통해서 보고 오는 것이 더 나을 것 같다.

골드메탈 아틀라스 설명 유튜브 링크

해당 유튜브에서 바로 첫 부분에 나오니 이 부분을 보고 참고해서 진행해보면 나을 것 같고, 지금은 유튜버님께서 아틀라스로 쉽게 작업할 수 있도록 이미지 파일을 제공해주셨는데 이렇게 안되어있는 파일들도 많다. 따라서 구글링을 통해서 아틀라스 만드는 법 또한 참고해보는 것도 나쁘지 않을 것 같다.

이제 본격적으로 걷기와 점프 애니메이션 작업에 들어가보도록 하자.

일전에 유튜브를 통해서 계속 강의를 들었다면 아틀라스 이미지 파일 또한 다운을 받았을 것이다. 혹시나 못 받으신 분이 있다면 위의 유튜브에 설명란을 참고해서 다운받을 수 있도록 하자.

먼저 Idle 애니메이션을 만들었을 때 처럼 걷기와 관련된 이미지 소스를 선택한 후 플레이어에 드래그해서 놔준다. 그렇게 되면 애니메이션 파일 저장 화면이 뜰 것이고 적절한 이름을 준 뒤에 저장을 한다.

그리고 Animator를 키면 다음과 같이 플레이어에 생성된 Walk 애니메이션이 자동으로 나오게 된다.

따라서 애니메이션을 오른쪽 클릭해서 Make Trasition을 눌러서 서로 연결을 해준다.

마찬가지로 점프까지 연결하게 되면 다음과 같이 연결선이 만들어진다.

점프와 걷기 애니메이션을 연결한 사진

이제 여기서 간단하게 변수를 설정하고 키 조작에 맞게 애니메이션을 실행시켜보도록 하자.

Animator 왼쪽에 보면 Parameter 오른쪽에 ➕ 버튼이 있다.

➕버튼을 눌러서 bool을 클릭하고 isWalking, isJumping 두 가지 변수를 만들어준다.

➕버튼을 눌러 다음과 같이 변수를 생성해준다.

지금 만들어진 변수를 가지고 각 Transition에 설정을 줄 것인데, 하나를 예로 설명을 하자면 Idle에서 Jump로 가는 것의 Condition을 걷지 않는 상태에서 점프를 하는 것이기 때문에 isWalking은 false, isJumping은 true로 설정해준다.

따라서 정리하면 다음과 같다.

그리고 각 Transition을 눌러서 Has Exit Time 설정을 체크 해제 해주고, 애니메이션이 겹치는 부분도 제거해준다. (유튜브 참고)

그리고 나서 이제 애니메이션을 캐릭터에 적용해보도록 하자!!!

다시 스크립트로 돌아와서 걷는 애니메이션 적용 방식을 생각해보면 캐릭터가 X축 방향의 값이 늘어나거나 줄어들게 되면 걷는다고 간주할 수 있다. 따라서 X축 값이 증가하면 오른쪽으로, X축 값이 감소하면 왼쪽으로 간다고 할 수 있다.

이 두가지를 동시에 코딩에 녹여보면 다음과 같다.

(Animator와 SpriteRender를 전역변수에 선언해준다, Awake에 변수 초기화도 잊지 않고 해준다.)

캐릭터 애니메이션 적용

따라서 키 입력이 -1일 경우에 flipX를 체크해서 캐릭터의 방향을 반대로 돌리고, 캐릭터의 X축 값이 0.4보다 작으면 걷기 애니메이션에서 만든 변수의 값을 false로 만들고, 0.4보다 크면 변수 값을 true로 바꿔서 애니메이션이 실행될 수 있도록 한다. (속도가 0보다 작을때로 하면 자연스러운 애니메이션이 나오지 않는다. 따라서 소숫점은 알아서 적절히 값을 변경해준다.)

그리고 jump를 할 때에도 점프 애니메이션이 나와야 하기 때문에 점프 로직 안에도 점프 변수 값을 변경해주는 로직을 추가해준다.

이렇게만 하고 플레이해보면 다음과 같이 캐릭터가 움직인다.

걷기 애니메이션과 점프 애니메이션이 실행되는 것을 볼 수 있다.

하지만 아직도 무한 점프가 되는 모습과 점프 애니메이션이 재생된 후에 애니메이션이 정상 상태로 돌아오지 않는 부분을 확인할 수 있다. 따라서 점프 한 후 플랫폼 바닥에 닿았으면 점프 애니메이션을 종료한 후 원래의 애니메이션 상태로 돌아가는 방식의 로직을 추가해주어야 한다.

🟡 여기서 과연 어떻게 캐릭터가 플랫폼과 충돌했다고 파악할 수 있을까?

우리는 여기서 Raycast라는 라이브러리를 사용할 것이다.

따라서 플랫폼은 Platform이라고 유니티에서 설정을 해주어야 하는데 Layer를 하나 추가해서 플랫폼 스프라이트에 추가를 해 줄 예정이다.

설치한 지형들을 체크한 후 Layer에서 Add Layer를 한 후 Platform을 추가한 후 설정해준다.

그리고나서 Raycast에 대해서 코딩을 하면 다음과 같이 코딩할 수 있다.

(Raycast는 물리 작업과 관련이 없기 때문에 void Update를 만든 후에 그 곳에 코딩한다. 캐릭터 애니메이션 설정 부분도 이쪽으로 이동시킨다.)

애니메이션 설정 및 Raycast 코딩 부분

따라서 간략하게 설명하면 Debug.DrawRay로 캐릭터에서 나오는 Ray를 확인할 수 있다.

Debug.DrawRay를 사용했기 때문에 실행 후 Scene에서 확인할 수 있다.

따라서 해당 빛이 어떤 물체에 닿았을 때 그 물체에 대한 정보를 가져오는 부분이 바로 밑에 줄인데, 우리는 부딪히는 스프라이트 중에 Layer가 Platform인 경우만 확인할 예정이다 (LayerMask에서 부딪힌 스프라이트 중에 Layer가 Platform인 경우에만 가져와서 rayhit에 저장한다.)

그리고나서 rayhit가 null이 아닐 경우, 즉 Platform에 닿아서 초기화 됐을때 rayhit의 거리가 플레이어의 반일 때 (빛이 플레이어의 중심부에서 나오기때문에 절반만 플레이어에 걸쳐(?)있기 때문에) 점프 변수를 초기화 한다.

이렇게 코딩을 하면 점프 후 정상적인 모션으로 돌아오는 것을 볼 수 있다.

걷기와 점프 애니메이션이 정상적으로 연결되는 것을 볼 수 있다.

이렇게 하면 점프하면서 점프 애니메이션과 걸을 때 걷기 애니메이션이 정상적으로 작동하는 것을 볼 수 있다.

7. 문워크 막기

마지막으로 위의 GIF를 살펴보면 방향키를 살짝 누르면 캐릭터가 얼음판 위를 미끄러지듯이 움직이는 부분을 살펴볼 수 있다.

이 부분은 아까 Physics Material 2D를 만들고 마찰력을 0으로 만들었기 때문에 발생한 부분이다. 따라서 이 부분을 약간이나마 고치기 위해서 공기 저항을 설정해주었던 것인데 아직도 석연치 않다.

따라서 이 부분도 우리가 코딩에서 해결해볼 예정인데 간단하다.

플레이어가 방향키를 떼었을 때, 캐릭터 속도가 일정 부분이 이하가 되면 멈추게 하고 애니메이션을 막아주면 된다.

    //방향키를 떼면 급격하게 속도 줄여주는 로직 (Stop Speed)
    if (Input.GetButtonUp("Horizontal")) {
        rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
    }

이와 같이 코딩해주면 되는데, 왜 velocity.normalized를 이용해서 했냐하면, 그냥 0.5f로 수치를 주게 되면 +값이기 때문에 무조건 오른쪽으로만 캐릭터가 움직이게 된다. 따라서 벡터의 값을 1.0로 가져오면서 방향성에 대한 부분을 가져오게 된다. 그리고 거기다가 어느 정도로 속도를 줄여줄 것인지에 대해서 곱해주면 캐릭터가 문워크를 하지 않고 속도가 줄게 될 것이다.

문워크 막기 전

문워크 막은 후

여기까지가 캐릭터 점프와 캐릭터 애니메이션에 관련된 부분이었다.

복습하는 개념으로 블로그 포스팅을 하는 거라서 조금씩 빠진 부분도 있으리라고 생각이 된다.

(저도 미리 해보고 블로그에 글을 쓰면서 다시 작업하고 있는 부분인데, 아직 많이 부족합니다.)

다음 블로그는 이제 충돌 이벤트를 통해서 코인을 먹는 부분과, 적 AI를 간단하게 구현해보는 부분을 포스팅할 예정이다.

그리고 시간이 남으면 적 AI를 점프로 공격해서 죽는 이벤트까지 해보기로 하자

오늘의 포스팅은 여기까지고 두서없는 이 글을 읽으신 분들은 여기까지 읽으시느냐고 수고하셨습니다.

그럼 바바~🖐🖐

profile
호주 워홀중 https://blog.naver.com/wnstjrl96

0개의 댓글