본문 바로가기
Unity/2D 게임 구현

[Unity 2D] 캐릭터 애니메이션 및 달리기 구현

by Classic Master 2024. 5. 19.
728x90

 

애니메이션 및 방향

저번에 이어서 이번에는 케릭터가 움직이는 방향에 따라 바라보게 설정하고, 케릭터의 움직임

그리고 애니메이션 기능을 추가해보겠습니다.

제가 작성한 이 글은 강좌 목적 글이 아니며, 학습 내용을 익히고자 하는 글이라 완벽하고 정확하지 않을 수 있습니다.

 

먼저 Charator(Player)에서 Add Component로 Animator를 추가해줍니다.

그 후 Controller에 Player를 넣어주고 타겟을 설정해줍니다.

 

폴더를 생성하고 Animation > Animator Controller를 생성합니다.

여기서 우리는 애니메이션의 모든 행동을 제어하겠습니다.

이름은 Player라 만들어주고 안으로 들어가보겠습니다.

저는 애니메이션을 idle , Walk , Run 기본적인 구성으로 준비하였으며, 직접 연결이 아닌 Blend Tree를 사용하여 작동해보겠습니다.

Animator 화면에서 오른쪽 버튼을 클릭해 Create State > From New Blend Tree를 해줍니다.

Blend Tree를 클릭 후 Parameter의 값을 xVelocity로 변경합니다.

그 후 화면에 Plus버튼을 눌러 Add Motion Field를 클릭하여 준비한 Idle, Walk, Run을 추가합니다.

이렇게 설정 후 코드를 작성하러 가겠습니다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    //----public Fields----//
    public float moveSpeed = 150f; //속도 값을 정해줍니다.
    
    //----Private Fields----//
    Rigidbody2D rigid;
    Animator Animator; //애니메이션 기능을 가져옵니다.
    float horizontalValue;
    float verticalValue;
    float runSpeedModifier = 2f; //저는 달리게되면 2배 빠르게 하기위해 2의 값을 추가하겠습니다.
    [SerializeField]
    bool isRunning = false; // 달리고 있는 상태를 확인하기 위해 추가합니다.
    bool facingRight = true; // 방향에 따른 화면 전환을 위해 추가합니다.

    
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        Animator = GetComponent<Animator>(); // 호출로 Animator 컴포넌트를 가져옵니다.
    }
    void Update()
    {
       horizontalValue = Input.GetAxisRaw("Horizontal");
       //verticalValue =   Input.GetAxisRaw("Vertical");

        if(Input.GetKeyDown(KeyCode.LeftShift)) // 쉬프트를 눌렀을때, 달리는 상태가 On
          isRunning = true;
       
        if(Input.GetKeyUp(KeyCode.LeftShift))  // 쉬프트를 땟을때, 달리는 상태 off
          isRunning = false;
        

    }
    void FixedUpdate()
    {
        Move(horizontalValue);
    }
     void Move(float dir)
    {
        float xVal = dir * moveSpeed * Time.deltaTime; 
        if (isRunning)
        {
            xVal *= runSpeedModifier;  //달리게 될경우 계산된 값에 위에서 설정한 값을 곱해줍니다.
        }
        Vector2 targetVelocity = new Vector2(xVal,rigid.velocity.y);
        rigid.velocity = targetVelocity;

//////////-----------------////////// 아래는 달리는 방향에 따라 케릭터 화면 전환 코드
         if (facingRight && dir < 0) // 설명 : 바라보는 방향의 값이 0보다 작으면 false
{
 transform.localScale = new Vector3(-1, 1, 1);
    facingRight = false;
}
else if (!facingRight && dir > 0) // 설명 :  바라보는 방향의 값이 0보다 크면 true
{
    transform.localScale = new Vector3(1, 1, 1);
    facingRight = true;
}    
///////////-----------------//////////

//Debug.Log(rigid.velocity.x); //속도 테스트 확인 
//0 , 4 walk , 6run
//애니메이터 xVelocity의 값을 Mathf.abs를 사용해 절대값으로 넘겨줌. 음수를 양수로!.

Animator.SetFloat("xVelocity", Mathf.Abs(rigid.velocity.x));

 

코드 작성이 끝난 후 Animator창으로 돌아와 Inspector 창에서 Automate Thresholds를 해제 후 변경해줍니다.

* Blend Tree > Moving 으로 이름을 변경하였습니다.

위 코드에서 테스트를 진행하여 속도를 측정합니다. 저는 idle 0 , walk 4 , run 6으로 설정해줍니다.

Unity에서 지원하는 이 기능은 애니메이션을 자연스럽게 넘어가기 위해 사용됩니다.

반응형

 

728x90
반응형

'Unity > 2D 게임 구현' 카테고리의 다른 글

[Unity 2D] 캐릭터 움직임 구현  (0) 2024.05.18