[Go-Unity 3D] 19. Layer / Blend Tree 실습 ⭐⭐⭐
카테고리: Go Unity
Layer / Blend Tree 실습
고박사의 유니티 기초를 정리.
1. Animation Layer
상하체 애니메이션 분리
Avatar Mask 설정 아바타 상체 설정 하체는 걷기 상체는 대기 애니메이션 실행
2. 1D Blend
- 한개의 파라미터(MoveSpeed)로 블렌드 (moveSpeed)
1D
Input setting Sprint
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
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
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
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
Direct Blend
기본 레이어에는 대기애니메이션
Face 레이어에 설정 (가중치 1 , Avatar 설정) Direct Blend 로 표정 변화
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감소) 확인후 증가, 감소 코루틴 실행 키 떄면 중지
실행결과
6. 정리
- Blend Tree 를 사용하여 파라미터 값에따라 다른애니메이션 재생 실습.
댓글남기기