[Unity] 유니티 게임개발

[Unity: 유니티 게임 개발] Player - 플레이어에 애니메이션 적용하기

ddgoori 2022. 12. 14. 17:33

Player - 플레이어에 애니메이션 만들기

 

캐릭터가 움직이긴 하는데 달리는게 아니라 공중부양해서 그대로 돌아다니는 느낌이다. 볼트모트 같은 느낌..? 그 이유는 달리는 애니메이션 효과가 적용되지 않았기 때문이다. 애니메이션을 적용해보자.

 

애니메이션 창을 띄워준다. Animation -> Animation을 선택한다.

 

Standing Sprite에 애니메이션을 줄 것이기 때문에 해당 오브젝트를 선택하고 애니메이션 창에서 Create Animaition을 해준다.

 

 

애니메이션 창에 분리된 움직이는 이미지들을 하나하나 옮겨 찍어준다.

 

애니메이터 창에서 빨간 Record를 누르고 인스펙터의 Sprite Renderer에 이미지를 가져다 놓으면 변화된 이미지가 레코드되어 프레임이 찍힌다.

 

가만 있을 때 상태가 아닌 점프하는 애니메이션을 추가하고자 한다. 애니메이션 창에서 Create New Clip을 누르고 애니메이션 클립을 추가해준다.

 

준비해둔 이미지 프레임들을 순서대로 애니메이션 타임라인에 찍어준다. 

 

 

Player - 플레이어에 애니메이션 컨트롤하기

애니메이션을 만들었으면 어떻게 이걸 캐릭터 상태와 연결할 것인가?

 

Standing Sprite를 누르고 인스펙터의 Animator에서 Controller 선택한다.

 

윈도우에서 애니메이터 창을 연다. 애니메이터 창이 아래처럼 나타난다.

 

이제 위에서 만들어놓은 애니메이션을 어떤 상태에 적용할 지 정할 수 있다. 내가 적용을 하고싶은 애니메이션을 우클릭하고 Make Transition을 누른다. 그럼 이 행동을 어디에 연결할지 선택할 수 있게 되는데, 이때 내가 변화를 주고싶은 엔티티에 연결을한다. 예를들어 내가 가만히 서있다가 움직이는 것을 하고싶을때는 Player_Idle에서 Player_Run 엔티리를 연결하는 것이다. 이렇게 연결하면 화살표 연결선이 생기는데 화살표 연결선을 누르면 우측에 창이 생긴다. Setting을 열어보면 트랜지션이 적용된 것을 알 수 있다.

 

 

Has Exit Time은 체크해제 시켜줘 계속 동작하도록 하고, Transition Duration은 0으로 해준다. 천천히 변할 것이 아니기 때문이다. 애니메이터 좌측에 파라미터를 추가할 수 있는데 speed:Float과 isOnGround:Bool을 적용해서 어떤 수치에서 어떤 애니메이션을 동작하게 할 것인지에 대한 파라미터를 추가해준다. 그리고 인스펙터 창에서 컨디션에 해당 값을 조절해준다. 예를 들어 플레이어가 Idle에서 Run으로 갈것이라면 speed가 0.1보다 높아야하는 것이다. 가만 있으면 speed가 0이고 run상태는 speed가 8로 지정한 적이 있다. 움직이는 상태는 8로 0.1보다 높기 때문에 당연 해당 애니메이션이 동작하게 되는 것이다.

 

반대로 Run에서 Idle로 갈때도 Make Transition을 해주고 컨디션을 추가해준다. Run에서 Idle 애니메이션으로 갈때는 당연히 speed가 0.1보다 적을때이다. Idle상태가 Speed가 0이기 때문이다. 이렇게 되면 각각의 상태에 맞게 애니메이션이 조절이된다. 수치를 정하고 변수를 만들고 이 변수를 애니메이터에서 파라미터 값으로 만들고, 해당 파라미터를 통해 캐릭터의 애니메이션을 조절해주는 방식인 것이다.

 

Run에서 Jump 애니메이션으로 갈 때는 조건이 isOnGround가 false일 때를 추가해준다. 왜냐하면 Jump를 하면 isOnGround가 true에서 false로 바뀌기 때문에 false값이 되었을 때 Jump애니메이션으로 가는것으로 로직을 구현해주는 것이다. 애니메이션은 오브젝트에 적용해놓은 변수들을 이용하여 조건을 넣어서 별개로 적용하는 것이라 생각하면 된다.

 

C# 스크립트에 아래의 코드를 적어주고 저장하고 나서 Player오브젝트를 눌러주면 Player Controller(Script) 인스펙터에 Anim이라는 필드가 생긴다. Stadning Sprite오브젝트에 애니메이션을 적용했기 때문에 이 오브젝트를 마우스로 끌어와 Anim필드에 놓아준다. 그러면 애니메이션이 Player 오브젝트에 적용이 된다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Rigidbody2D theRB;

    public float moveSpeed;
    public float jumpForce;

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

	// 애니메이션 추가
    public Animator anim;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        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);
        }

		// 애니메이션 추가
        anim.SetBool("isOnGround", isOnGround);
        anim.SetFloat("speed", Mathf.Abs(theRB.velocity.x));
    }
}

 

이제 방향키를 왔다갔다 해보고 점프를 해보면 애니메이션이 움직인 것을 확인할 수 있다. 그러나 뒤로 갈때 마치 캐릭터가 문워크하는 것과 같다. 뒤로 가는 왼쪽 방향키를 눌러도 앞으로 달려가는 애니메이션이 적용되어있기 때문이다. 다음 포스팅에서는 캐릭터를 Flip시키는 법을 배울 것이다.