[Go-Unity 3D] 19. Layer / Blend Tree 실습 ⭐⭐⭐

업데이트:

카테고리:

태그: , ,


Layer / Blend Tree 실습

고박사의 유니티 기초를 정리.

1. Animation Layer

상하체 애니메이션 분리

Avatar Mask 설정 아바타 상체 설정 하체는 걷기 상체는 대기 애니메이션 실행 image



2. 1D Blend

  • 한개의 파라미터(MoveSpeed)로 블렌드 (moveSpeed)

1D
image

Input setting Sprint
image

PlayerController1D.cs

PlayerController1D.cs

using UnityEngine;

public class PlayerController1D : MonoBehaviour
{
    private Animator animator;
    //private   float   walkSpeed = 4.0f;
    //private   float   runSpeed = 8.0f;
    
    private void Awake()
    {
        animator = GetComponent<Animator>();
    }
    private void Update()
    {
        float vertical = Input.GetAxis("Vertical");// 위, 아래 방향키 입력
        // Shft키를 안누르면 최대 0.5, Shft키를 누르면 최대 1까지 값이 바뀌게 된다
        float offset = 0.5f + Input.GetAxis("Sprint") * 0.5f;

        // 오른쪽 방향키를 누르면 forward가 +이지만 왼쪽 방향키를 누르면 forwad가 -이기 때문에
        // 애니메이션 파라미터를 설정할 땐 절대값으로 적용한다
        float moveParameter = Mathf. Abs (vertical * offset);

        //moveParameter 값에 따라 애니메이션 재생 (0:대기, 0.5:걷기, 1:뛰기) 
        animator.SetFloat("moveSpeed", moveParameter);
        
        // 이동속도: Shift키를 안눌렀을 땐 walkSpeed, 
        //Shift키를 눌렀을 땐 runspeed 값이 moveSpeed에 저장 
        //float moveSpeed = Mathf. Lerp (walkSpeed, runSpeed, Input.GetAxis("Sprint"));

        // 실제 이동
        //transform.position += new Vector3(vertical, 0, 0)* moveSpeed* Time.deltaTime;
    }
}

  • Vertical 위 아래 방향키로 걷기
  • offset Sprint 로 쉬프트 입력시 뛰기모션
  • 입력x 대기




3. 2D Simple Blend

  • 2D Simple Directional : 각 방향에 제일 큰 값만 인식 (걷기,뛰기 X)

2D Simple
image

PlayerController2D.cs

PlayerController2D.cs

using UnityEngine;

public class PlayerController2D : MonoBehaviour
{
    private Animator animator;

    private void Awake()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
    float horizontal = Input.GetAxis("Horizontal");     // 좌, 우 방향키 입력 
    float vertical = Input.GetAxis("Vertical");         // 위, 아래 방향키 입력

    // horizontal 값에 따라 애니메이션 재생 (-1:왼쪽, 0: 가운데, 1:오른쪽)
    animator.SetFloat("Horizontal", horizontal);

    // vertical 값에 따라 애니메이션 재생 (-1:뒤, 0: 가운데, 1:앞)
    animator.SetFloat("Vertical", vertical);

    // 이동속도
    //float moveSpeed = 5.0f;
    // 실제 이동
    //transform.position += new Vector3 (horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
    }
}

  • Vertical 위 아래 방향키로 걷기
  • Horizontal 좌 우 방향보며 걷기
  • 입력x 대기




4. 2D Freeform Directional Blend

  • 2D Freeform Directional : 같은방향 여러개 애니메이션 배치 가능(걷기,뛰기 O)

2D Freeform Directional
image

PlayerController2DFreeformD.cs

PlayerController2DFreeformD.cs

using UnityEngine;

public class PlayerController2DFreeformD : MonoBehaviour
    {
    private Animator animator;
    //private   float   walkSpeed = 4.0f;
    //private   float   runSpeed = 8.0f;

    private void Awake()
    { 
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        float horizontal = Input.GetAxis("Horizontal"); // 좌, 우 방향키 입력 
        float vertical = Input.GetAxis("Vertical");     // 위, 아래 방향키 입력
        
        // Shft키를 안누르면 최대 0.5, Shft키를 누르면 최대 1까지 값이 바뀌게 된다.
        float offset = 0.5f+ Input.GetAxis("Sprint") * 0.5f;
        // horizontal 값에 따라 애니메이션 재생 (-1:왼쪽, 0:가운데, 1:오른쪽) 
        animator.SetFloat("Horizontal", horizontal * offset);
        
        // vertical 값에 따라 애니메이션 재생 (-1:뒤, 6: 가운데, 1:앞)
        animator.SetFloat("Vertical", vertical * offset);

        // 이동속도: Shift키를 안눌렀을 땐 walkSpeed, Shift키를 눌렀을 땐 runspeed값이 moveSpeed에 저장
        // float moveSpeed = Mathf. Lerp (walkSpeed, runSpeed, Input.GetAxis("Sprint"));
        // 실제 이동
        // transform.position += new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
    }
}

  • Vertical 위 아래 방향키로 걷기
  • Horizontal 좌 우 방향보며 걷기
  • Shift 입력시 뛰기
  • 입력x 대기




5. 2D Freeform CarTesian Blend

  • 2D Freeform CarTesian : 동일한 방향으로 진행되는 애니메이션

2D Freeform CarTesian
image

PlayerController2D.cs

PlayerController2D.cs

using UnityEngine;

public class PlayerController2DFreeformC : MonoBehaviour
{
    private Animator animator;

    private void Awake()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
    float horizontal = Input.GetAxis("Horizontal");    // 좌, 우 방향키 입력
    float vertical = Input.GetAxis("Vertical");          // 위, 아래 방향키 입력

    // horizontal 값에 따라 애니메이션 재생 (-1:왼쪽, 0: 가운데, 1:오른쪽)
    animator.SetFloat("Horizontal", horizontal);
    
    // vertical 값에 따라 애니메이션 재생 (0: 가운데, 1:앞) 
    animator.SetFloat("Vertical", vertical);
    }
}

  • Vertical 위 아래 방향키로 뛰기
  • Horizontal 좌 우 방향보며 뛰기
  • 입력x 대기




5. Direct Blend

  • Direct Blend : Moiton 개수만큼 파라미터 필요

Avatar Mask 생성 -> 얼굴에 관련된 설정 ON FacrAvatar

Direct Blend
기본 레이어에는 대기애니메이션
Face 레이어에 설정 (가중치 1 , Avatar 설정) Direct Blend 로 표정 변화 image

image

PlayerContorllerDirect.cs

PlayerContorllerDirect.cs

using System.Collections;
using UnityEngine;

public class PlayerContorllerDirect : MonoBehaviour
{

    private Animator animator;

    private void Awake()
    {
        animator = GetComponent<Animator>();
    }
    
    private void Update()
    {
        
        KeyEvent(0, KeyCode.Q, "angry");    // Q키를 누르면 angry 파라미터 값 증가 
        KeyEvent(1, KeyCode.A, "angry");    // A키를 누르면 angry 파라미터 값 감소
        
        KeyEvent(0, KeyCode.W, "eye");      // W키를 누르면 eye 파라미터 값 증가 
        KeyEvent(1, KeyCode.S, "eye");      // S키를 누르면 eye 파라미터 값 감소
        
        KeyEvent(0, KeyCode.E, "sap");      // E키를 누르면 sap 파라미터 값 증가 
        KeyEvent(1, KeyCode.D, "sap");      // D키를 누르면 sap 파라미터 값 감소
    
        KeyEvent(0, KeyCode.R, "smile");     // R키를 누르면 smile 파라미터 값 증가 
        KeyEvent(1, KeyCode.F, "smile");     // F키를 누르면 smile 파라미터 값 감소
    }


    private void KeyEvent(int type, KeyCode key, string parameter)
    {
        // key 키를 누르면 파라미터 값 증가/감소 시작
        if (Input.GetKeyDown(key) )
        {
            string coroutine = type==0 ? "ParameterUp" : "ParameterDown";
            StartCoroutine(coroutine, parameter);
        }

        // key 키를 떼면 파라미터 값 증가/감소 중지
        else if (Input.GetKeyUp(key) )
        {
            string coroutine = type==0? "ParameterUp" : "ParameterDown";
            StopCoroutine(coroutine);
        }
    }

    private IEnumerator ParameterUp(string parameter)
    {
        // 현재 파라미터 값을 받아온다
        float percent = animator.GetFloat(parameter);

        // 파라미터 값을 증가시키는 코루틴이기 때문에 1이 될때까지 실행 
        while (percent < 1 )
        {
            percent += Time.deltaTime; // percent 값 증가
            animator.SetFloat (parameter, percent);
            yield return null;
        }
    }

    private IEnumerator ParameterDown(string parameter)
    {
    // 현재 파라미터 값을 받아온다
    float percent = animator.GetFloat(parameter);

    // 파라미터 값을 감소시키는 코루틴이기 때문에 0이 될때까지 실행 
        while (percent > 0 )
        {
            percent -= Time.deltaTime; // percent 값 감소
            animator.SetFloat(parameter, percent);
            yield return null;
        }
    }
}


  • 코루틴 함수 ParameterUP ParameterDown 로 파라미터 증가 감소
  • Key Event 키를 누르고 땔때 코루틴함수 -> 파라미터 값 변경
  • qawsedrf 입력시 type(0증가,1감소) 확인후 증가, 감소 코루틴 실행 키 떄면 중지

실행결과
image





6. 정리

  • Blend Tree 를 사용하여 파라미터 값에따라 다른애니메이션 재생 실습.


참고 : 유니티 TOP


📔

댓글남기기