Unity 공부 (17)

도토코·2025년 3월 12일

Unity공부

목록 보기
17/22

Chapter 6

State Machine


객체가 여러 개의 상태(State)를 가지며, 특정 조건에 따라 상태가 전환(Transition)되는 구조를 의미한다.

애니메이션의 전환


위의 사진과 같이 Transition을 사용하여 애니메이션의 전환이 일어난다.

Transition(상태 전환)

이 속성은 애니메이션 상태 A에서 상태 B로 전환할 때 사용되는 설정이다.
Idle상태에서 Running상태로 전환하는 경우와 같이, 애니메이션 간의 흐름을 결정하는 것.

  1. Has Exit Time (종료 시전 사용 여부)

    • 상태 전환이 이루어지기 전에 애니메이션이 끝날 때까지 기다릴지 여부 확인

    • 활성화 X : 전환이 즉시 일어난다.

    • 활성화 O : 현재 상태가 끝날 때까지 기다리고, 이후 exit time에 정의된 시간에 따라 전환이 시작된다.

  2. Exit Time (종료 시점)

    • 상태 전환이 시작될 지점을 설정한다.
    • 기본값 : 1.0 (애니메이션이 끝날 때)
    • 활성화 시 : 애니메이션의 끝나는 지점을 0.0에서 1.0사이로 설정할 수 있다. 이 값을 0.5로 설정하면 애니메이션의 절반이 끝날 때 전환이 시작된다는 뜻이다.

Has Exit Time, Exit Time, Fixed Duration과의 사용

  • Fixed Duration에 체크 표시가 되어 있다면 Exit Time 값이 "절대 시간"으로 해석되어 Exit Time값이 0.5이고 Has Exit Time이 체크되어 있다면 절대적 "0.5초"의 시간 후에 다음 전환이 발생한다.
  • Fixed Duration에 체크 표시가 되어 있지 않다면 Exit Time 값이 "비율 (%)"으로 해석되어 Exit Time값이 0.5이고 Has Exit Time이 체크되어 있다면 해당 애니메이션의 전체 재생 길이의 50%가 재생된 후에"의 시간 후에 다음 애니메이션으로의 전환이 발생한다.
  1. Transition Duration (전환 시간)
    위의 사진의 그래프를 보면 RUN상태에서 WAIT상태로 블렌딩되듯이 전환이 일어나고 있는 것을 볼 수 있다.
    이 때, 블렌딩되는 파란색의 범위가 Transition Duration이다.

  • 한 애니메이션에서 다른 애니메이션으로 전환되는 시간을 설정한다.
  • 기본값 : 0.25초
  • 활성화 시 : Transition Duration을 늘리면, 애니메이션이 자연스럽게 부드럽게 전환되며, 0초로 설정하면 즉각적으로 전환된다.
    • 범위 좁음 : 블렌딩이 적게 되어 전환이 빨라지는 대신 부자연스러운 움직임이 있을 수 있다.
    • 범위 넓음 : 블렌딩이 많아 전환이 느리지만 부드럽게 다음 애니메이션으로의 전환이 가능하다.
  1. Interruption Source (중단 소스)

    • None : 아무런 중단 없이, 현재 상태가 전환되는 것을 그래도 유지한다.

    • Next State : 현재 애니메이션이 중단되고, 다음 상태가 바로 실행된다.

    • Current State : 현재 상태에서 다시 시작하도록 설정한다. 이 경우 현재 상태가 중단되고, 즉시 재시작된다.

  2. Condition (전환 조건)

    • 상태 전환이 어떤 조건에서 이루어져야 할지를 설정한다.

    • 조건 : 파라미터 (Parameter) 를 기반으로 전환 조건을 설정한다.

      • Bool 값 : IsWalking이 true일 때 Idle상태에서 Moving 상태로 전환
      • Trigger 값 : JumpTrigger가 활성화되면 Idle상태에서 Jump 상태로 전환
      • Float 값 : Speed가 0.5 이상이면 Idle 상태에서 Moving 상태로 전환

실습 코드와 설명

Condition

Animator의 Parameters에 float타입으로 speed라는 변수를 만들어주고 난 후에,

RUN -> WAIT (Transition)

  • speed가 1보다 작아지면 RUN에서 WAIT 애니메이션이 나오게 한다.

WAIT -> RUN (Transition)

  • speed가 1보다 커지면 WAIT에서 RUN 애니메이션이 나오게 한다.

위와 같이 각각의 Transition에서 둘 다 Has Exit Time을 꺼주고 Condition을 설정해주었다.

    void UpdateMoving()
    {
        Vector3 dir = _destPos - transform.position;
        if(dir.magnitude < 0.0001f)
        {
            _state = PlayerState.Idle;
        }
        else
        { 
            float moveDist = Mathf.Clamp(_speed * Time.deltaTime, 0, dir.magnitude);
            // 1번 방법
            // if (moveDist > = dir.magnitude)
            //     moveDist = dir.magnitude

            transform.position += dir.normalized * moveDist;

            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime);
        }

        // 애니메이션
        Animator anim = GetComponent<Animator>();
        //현재 게임 상태에 대한 정보를 넘겨준다.
        anim.SetFloat("speed", _speed);
    }
    void UpdateIdle()
    {
        // 애니메이션
        Animator anim = GetComponent<Animator>();
        anim.SetFloat("speed", 0);
    }

위와 같이 코드르 작성해준다.
//애니메이션이라고 적혀있는 곳을 잘 보면
이렇게 스크립트에서 애니메이션 파라미터 값을 설정할 수가 있다. 이 파라미터 값의 변화에 따라 전이 Condition 조건식이 만족하여 전이가 일어나게 된다.


참조
https://ansohxxn.github.io/unity%20lesson%202/ch6-4/

profile
코(딩)(꿈)나무

0개의 댓글