_Han_
나의 개발 노트
_Han_
  • 분류 전체보기 (272)
    • 데이터 엔지니어링 (29)
    • 인프라 (3)
    • 추천시스템 (11)
    • 코딩테스트 (146)
    • 부트캠프 회고 (15)
    • 회고 (4)
    • 자격증 (1)
    • 파이썬 프로그래밍 (6)
    • 통계 (2)
    • Git (21)
    • 유니티2D (33)

최근 글

반응형
hELLO · Designed By 정상우.
_Han_

나의 개발 노트

#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환)
유니티2D

#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환)

2020. 11. 30. 16:54
반응형

이번 포스팅은 #8-1 유니티 캐릭터(Player) 이동하기 포스팅의 다음 포스팅으로 캐릭터가 이동할 때 애니메이션이 바뀌도록 하겠습니다.

1. 애니메이션 전환을 사용하는 방법

2. 애니메이션 블렌드 트리 사용하는 방법

2가지에 대하여 다루도록 하겠습니다.

포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.

 

#1 유니티2D 개발 시작하기

안녕하세요 첫 포스팅입니다. 유니티2D 관련 포스팅을 진행하겠습니다. 게임개발에 필요한 지식을 전달하고 함께 학습하겠습니다. 먼저 유니티2D 개발 블로그 포스팅에 앞서 참고한 책을 소개합

my-develop-note.tistory.com

 

#8-1 유니티 캐릭터(Player) 이동하기 포스팅 링크입니다.

 

#8-1 유니티 캐릭터(Player) 이동하기

이번 포스팅 C# 스크립트를 사용하여 그동안 만들었던 PlayerObject를 이동하는 것을 보여드리도록 하겠습니다. 포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다. http

my-develop-note.tistory.com


애니메이션 전환을 사용하는 방법

Assets > Animations > Contorllers > PlayerController 애니메이션 상태머신을 열겠습니다.

저는 현재 player-idle 애니메이션이 기본 상태이며, 오른쪽, 왼쪽, 위, 아래로 움직이는 애니메이션이 있습니다.

※애니메이션 상태머신에서 alt키와 애니메이션 상태머신의 바탕을 클릭하고 이동하면 상태머신을 둘러볼 수 있습니다.

※마우스 휠을 이용하면 애니메이션 상태머신을 확대/ 축소 할 수 있습니다.

애니메이션을 기본 상태로 변경하는 방법은 기본상태로 만드는 방법입니다.

만들고 싶은 애니메이션을 마우스 오른쪽 클릭 > Set as Layer Default State 클릭합니다.

현재 저는 player-idle 애니메이션이 이미 기본 상태이기 때문에 클릭할 수 없게 되어있습니다.

 

지금부터는 캐릭터가 이동할 때 애니메이션도 함께 사용하는 방법에 대하여 이야기하겠습니다.

 

Any State > 마우스 오른쪽 클릭 > Make Transition 클릭하여 전환을 만들고 5가지 애니메이션에 전환을 연결합니다.

Animator > Parameters > int  Parameter(파라미터)를 생성하고 파라미터의 이름은 AnimationState로 바꾸었습니다.

 

Animations Parameter(애니메이션 파라미터)란 애니메이션 컨트롤러에 정의하는 변수로 스크립트(C#)에서 애니메이션 상태머신을 제어할 때 사용합니다. 

애니메이션 파라미터는 전환과 상태를 사용할 때 필요합니다.

1. Any State에서 Player-right-move로 가는 전환을 클릭해줍니다.

2. Inspector창에서 아래와 같이 설정을 합니다.

 

Has Exit Time(종료 시간 있음) : 체크 해제

Fixed Duration(고정 지속 시간) : 체크 해제

Transition Duration(%)(전환 지속 시간)(%) : 0

Interruption Source(중단 소스) : Current State Then Next State

Ordered Interruption(순차적 중단) : 체크 해제

Can Transition To self(자체 전환 가능) : 체크 해제

 

Inspector > Conditions > + 버튼을 클릭합니다.

AnimationState > Equals > 1을 입력합니다.

 

이렇게 player-right-move의 조건을 설정을 하였습니다. 나머지 player-left-move, player-up-move, player-down-move, player-idle 애니메이션의 조건 또한 설정해야 합니다.

 

Conditions 부분을 제외한 나머지 부분은 동일하게 적용합니다

Conditions의 부분만 left 부터 idle 순으로 2~5의 번호를 지정합니다.

 

게임을 진행하는 동안 애니메이터는 언제든 해당 조건이 참이 되면 해당 애니메이션을 실행할 것입니다.

이제 스크립트를 사용하여 PlayerObject의 애니메이션 파마미터의 조건을 참으로 설정하겠습니다.

 

MoveController의 전체 스크립트입니다.

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

public class MoveController : MonoBehaviour
{
    public float movementSpeed = 3.0f;
    Vector2 movement = new Vector2();
    Rigidbody2D rigidbody2D;

    Animator animator;
    string animationsState = "AnimationState";

    enum States
    {
        right = 1,
        left = 2,
        up = 3,
        down = 4,
        idle = 5
    }
    void Start()
    {
        animator = GetComponent<Animator>();
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        UpdateState();
    }

    private void FixedUpdate()
    {
        MoveCharacter();
    }

    private void MoveCharacter()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");

        movement.Normalize();

        rigidbody2D.velocity = movement * movementSpeed;
    }

    private void UpdateState()
    {
        if (movement.x > 0)
        {
            animator.SetInteger(animationsState, (int)States.right);
        }
        else if (movement.x < 0)
        {
            animator.SetInteger(animationsState, (int)States.left);
        }
        else if (movement.y > 0)
        {
            animator.SetInteger(animationsState, (int)States.up);

        }
        else if (movement.y < 0)
        {
            animator.SetInteger(animationsState, (int)States.down);
        }
        else
        {
            animator.SetInteger(animationsState, (int)States.idle);
        }
    }
}

 

작성한 스크립트중 중요하다고 생각되는 부분만 살펴보도록 하겠습니다.

 

enum States
    {
        right = 1,
        left = 2,
        up = 3,
        down = 4,
        idle = 5
    }

"enum"데이터 형식을 사용하여 열거형 상수를 선언하였습니다.

열거형 상수 뒤에 int(정수) 값과 일치하므로 해당 값을 얻을 수 있습니다.

위에서 하였던 전환 설정시에 int값과 일치하게 적고 int값을 사용하여 애니메이션 상태를 설정할 것입니다.

private void UpdateState()
    {
        if (movement.x > 0)
        {
            animator.SetInteger(animationsState, (int)States.right);
        }
        else if (movement.x < 0)
        {
            animator.SetInteger(animationsState, (int)States.left);
        }
        else if (movement.y > 0)
        {
            animator.SetInteger(animationsState, (int)States.up);

        }
        else if (movement.y < 0)
        {
            animator.SetInteger(animationsState, (int)States.down);
        }
        else
        {
            animator.SetInteger(animationsState, (int)States.idle);
        }
    }

UpdateState() 메서드를 작성하였습니다.

movement.x > 0 보다 크다는 조건의 의미는 (1,0)이 되었다는 의미로 x축의 움직임이 0보다 커졌다는 의미로 오른쪽으로 이동하였다는 것입니다.

SetInteger() 메서드는 string(문자열), int(정수) 값을 두 개의 파라미터를 받습니다.

첫번째 파라미터는 우리가 위에서 애니메이션 상태머신에서 추가한 AnimationState입니다.

 string animationsState = "AnimationState";

animationState라는 변수에 string(문자열) 변수에 저장하였습니다.

두번째 파라미터는 int정수값입니다. 이것은 우리가 위에서 선언한 "enum" 데이터 형식의 열거형 상수입니다.

    void Update()
    {
        UpdateState();
    }

Update() 메서드에 방금 작성한 UpdateState() 메서드를 입력하였습니다.

Update() 메서드는 일정한 간격으로 호출하는 FixedUpdate() 메서드와는 달리 프레임당 한번씩 불리는 메서드입니다.

 

이제 작성한 스크립트를 저장을 합니다.

 

게임을 실행시켜 보면 정상적으로 작동하는 것을 볼 수 있습니다.

추가로 애니메이션 상태머신에서 애니메이션 상태를 클릭한 후에 Inspector창에서 Speed의 값을 자신이 원하는 값으로 바꾸어 실행해 보면 애니메이션의 속도가 바뀐 것을 볼 수 있습니다.

저는 속도가 너무 빠른것 같아 0.5로 조절하였습니다.

 

만약 애니메이션이 반복실행이 되지 않는다면 Assets > Animations > Animations 에서 반복 실행이 되지 않는 애니메이션을 선택한 후에 Inspector 창에서 Loop Time을 체크 하시기바랍니다.

 

애니메이션 블렌트 트리 사용방법은 다음 포스팅에서 진행하도록 하겠습니다!

 

마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!


감사합니다! :)

반응형

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

#9-1 유니티 타일맵, 타일팔레트  (0) 2020.12.01
#8-3 유니티 캐릭터(Player) 이동하기_애니메이션(블렌드트리)  (0) 2020.12.01
#8-1 유니티 캐릭터(Player) 이동하기  (0) 2020.11.27
#7 유니티 프리팹(Prefab)  (0) 2020.11.27
#6 유니티 태그(Tag), 레이어(Layer)  (0) 2020.11.27
    '유니티2D' 카테고리의 다른 글
    • #9-1 유니티 타일맵, 타일팔레트
    • #8-3 유니티 캐릭터(Player) 이동하기_애니메이션(블렌드트리)
    • #8-1 유니티 캐릭터(Player) 이동하기
    • #7 유니티 프리팹(Prefab)
    _Han_
    _Han_
    학습한 것을 기록합니다.

    티스토리툴바