본문 바로가기
유니티

2D 캐릭터 애니메이션 전환

by Nhahan 2022. 6. 14.

2D 애니메이션에 대한 이해가 조금 부족하시다면, https://nhahan.tistory.com/70?category=941686 부터 읽고와주세요!

 


 

Running 애니메이션을 만들고, 우클릭 - Make Transition으로 Idle과 Running을 각각 이어준다.

Animator의 Parameters 탭에서 +를 눌러 Bool 타입으로 IsRunning이라는 파라미터를 만들어준다.

 

당연하게도 달릴거면 true, 안달릴거면 false

Transition 화살표를 누르고 Conditions에 IsRunning 조건을 넣어주고 Idle -> Running은 true, 반대는 false로 설정해준다.

 


 

캐릭터를 움직이려면 Input이 있어야한다.

 

이미 Install해서 Remove로 되어있다.

먼저 Package Manager에서 Input System을 Install 해준다.

 

Player의 Inspector에서 Add Component - Player Input을 추가해주고, Create Actions...를 눌러준다.

 

/Assets/Input System에 Player Input이라는 이름으로 저장해준다.

 

점프 안 만들거라면 할 필요 없다.

Actions에서 Jump를 만들어주고 Space를 바인딩해준다.

 

위 사진은 이미 Create settings asset을 한 상태!

Player의 Inspector에서 Open Input Settings를 누르면 Project Settings 창이 뜨는데, 여기서 Input System Package 탭에 들어가 Create settings asset을 클릭한다.

 

PlayerMovement 스크립트를 만들고 Player에 넣어준다.

그리고 스크립트 작성만 하면 된다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem; // 넣어주자!

public class PlayerMovement : MonoBehaviour
{
    [SerializeField] float speed = 10f;

    Vector2 moveInput;
    Rigidbody2D rigidBody;
    Animator animator;

    void Start()
    {
        rigidBody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        Run();
        FlipSprite();
    }

    void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    void Run()
    {
        Vector2 playerVelocity = new Vector2 (moveInput.x * speed, 0);
        rigidBody.velocity = playerVelocity;
        bool hasHorizontalSpeed = Mathf.Abs(rigidBody.velocity.x) > Mathf.Epsilon;
        // Mathf.Abs는 절대값을 반환하고, Mathf.Epsilon은 0에 가까운 수인데 그냥 0이라고 생각해도 무방하다.

        animator.SetBool("isRunning", hasHorizontalSpeed);
    }

    void FlipSprite()
    {
        bool hasHorizontalSpeed = Mathf.Abs(rigidBody.velocity.x) > Mathf.Epsilon;

        if (hasHorizontalSpeed)
        {
            transform.localScale = new Vector2 (Mathf.Sign(rigidBody.velocity.x), 1f);
            // Mathf.Sign()은 부호를 반환한다.
        }
    }
}

설명은 주석으로 적어놓았다.

 

완성

 

 

 

'유니티' 카테고리의 다른 글

딜레이 주기  (0) 2022.06.16
2D 캐릭터 애니메이션  (1) 2022.06.14
Sprite Editor로 Sprite Slice 하기  (0) 2022.06.13
파티클 이펙트  (0) 2022.06.12
메소드 실행 늦추기  (0) 2022.06.12

댓글