728x90

 

간단한 애니메이션을 필요로할때는 아무 문제 없지만 만약 플레이어 , 보스 등 다양한 상태를 가지고 있다면 많은 애니메이션을 필요로 할것입니다.

간단한 애니메이션
복잡한 애니메이션

특히 많은 상태가 이미 있는 와중 새로운 상태가 생긴다면 모든 상태에 대해 새로운 트랜지션을 추가해줘야하는 일이 생깁니다.

 

실제 겪은 사례) 사전동작 없이 Dash만 하던 보스가 Dash를 하기전 DashReady라는 새로운 상태를 추가해주려고 했으나

Dash위치에 DashReady상태를 넣게된다면 트랜지션에 Conditions값들을 다 바꾸어줘야하며 애니메이션이 늘어날때마다 트랜지션을 계속해서 추가해줘야하는 상황이 발생

 

 

 

 

애니메이션 전환 - Unity 매뉴얼 (unity3d.com)

 

애니메이션 전환 - Unity 매뉴얼

애니메이션 전환(Animation transitions)을 사용하면 상태 머신이 하나의 애니메이션 상태에서 다른 애니메이션 상태로 전환하거나 혼합될 수 있습니다. 전환은 상태 간의 혼합이 가져야 하는 기간뿐

docs.unity3d.com

상태 머신 기초 - Unity 매뉴얼 (unity3d.com)

 

상태 머신 기초 - Unity 매뉴얼

기본적으로 캐릭터는 항상 특정 종류의 액션을 취하고 있다 봅니다. 취할 수 있는 액션은 게임플레이의 타입에 따라 다르지만 일반적으로 대기, 걷기, 달리기, 점프 등이 있습니다. 이 액션들을

docs.unity3d.com

 

상태 머신에 대해 궁금하시다면 유니티 Documentation을 참고하시면 됩니다.

 

그래서 분명 트랜지션없이 애니메이션을 작동시킬 수 있는 방법이 있을것이라고 생각했고

 

해결 방법을 찾아냈습니다.

 

일단 트랜지션을 이용하여 애니메이션을 작동시켜보겠습니다.

 

 

애니메이션 기본 상태(Idle)를 제외하고 3개밖에 상태가 없지만 트랜지션은 적지않은것을 볼 수 있습니다.

만약 여기서 애니메이션이 1개 2개 점점 늘어나면 트랜지션도 점진적으로 늘어날것이며 그 과정에서 생각하지 못한 문제가 많이 발생할 것입니다(모든 상태 변화에 대해 고려해야하기 때문).

 

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

public class animtest : MonoBehaviour
{
    Animator anim;
    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))
        {

            if (Input.GetKey(KeyCode.LeftShift))
            {
                anim.SetBool("isRun", true);
                anim.SetBool("isWalk", false);
            }
            else if (Input.GetKeyDown(KeyCode.Space))
            {
                anim.SetTrigger("doJump");
            }
            else
            {
                anim.SetBool("isWalk", true);
                anim.SetBool("isRun", false);
            }
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            anim.SetTrigger("doJump");
        }
        else
        {
            anim.SetBool("isWalk", false);
        } 
    }
}

 

※애니메이션 작동만 확인하기위해 대충 작성한 애니메이션 코드라서 참고하는건 추천드리지않습니다

 

단순하게 걷기 , 뛰기 , 점프 애니메이션만으로도 코드가 길어지며 여기서 상태가 추가된다면 훨씬 더 복잡한 트랜지션과 코드가 생길것입니다.

 

그래서 이번에는 트랜지션 없이 애니메이션을 구현해보겠습니다.

 

 

위 결과를 보면 트랜지션 없이 애니메이션이 바뀌는 모습입니다

이렇게 바꾸니 훨씬 보기 편하고 간단해졌네요!

 

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

public class animtest2 : MonoBehaviour
{
    private string currentAnimaton;

    private Animator animator;

    const string PLAYER_IDLE = "idle";
    const string PLAYER_WALK = "walk";

    const string PLAYER_RUN = "run";

    float vAxis;
    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        vAxis = Input.GetAxis("Vertical");
        if (vAxis != 0)
        {
            if (Input.GetKey(KeyCode.W))
            {

                if (Input.GetKey(KeyCode.LeftShift))
                {
                    ChangeAnimationState(PLAYER_RUN);
                }
                else
                {
                    ChangeAnimationState(PLAYER_WALK);
                }
            }

        }
        else 
        {
            ChangeAnimationState(PLAYER_IDLE);
        }

    }

    void ChangeAnimationState(string newAnimation)
    {
        if (currentAnimaton == newAnimation) return;

        animator.Play(newAnimation);
        currentAnimaton = newAnimation;
    }
}

 

소스코드도 아까보다 깔끔해진 모습입니다 물론 이것도 기능만 확인하기위해 간단하게 작성한 코드니 참고만 하시면 되겠습니다.

 

위 기능의 핵심은 ChangeAnimationState()함수입니다 string 형태로 변수를 받아서 플레이어가 특정 액션을 하면 애니메이션을 Play 하도록 해주었습니다 

단 트랜지션을 사용할때와는 달리 상태를 잘 정의해줘야합니다 그리고 애니메이션이 변경될때 뚝뚝 끊기듯 부드럽지않게 변경이 되는데 이를 자연스럽게 해주는 TransitionDuration이 없어서 그렇습니다. 

 

그래서 다음 글은 CrossFade라는 기능을 활용해서 애니메이션을 부드럽게 변화시켜줘보겠습니다.

728x90

+ Recent posts