Avatar Mask의 Humanoid를 이용하여 동작 제어
Animator에서 레이어 추가 후 설정에서 가중치 최대(1)로 설정 후 Mask에 만들어 놓은 Avata Mask를 추가해주고, 다른 동작을 드레그 앤 드랍으로 옮겨 준다
즉, Avata Mask를 활용하여 모션들을 제어하고 추가 할 수 있다
대기, 방향키(걷기), 뛰기(shift + 방향키)
using System.Collections;
using System.Collections.Generic;
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"); // 위, 아래 방향키 입력
// shift키를 안누르면 최대 0.5, shift키를 누르면 초대 1까지 값이 바뀌게 된다
float offset = 0.5f + Input.GetAxis("Sprint") * 0.5f;
//오른쪽 방향키를 누르면 forward가 +이지만 왼쪽 방향키를 누르면 forward가 -이기 때문에 애니메이션 파라미터를 설정할 땐 절대값으로 적용한다
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 Verctor3(vertical, 0, 0) * moveSpeed * Time.deltaTime;
}
}
앞으로가기, 뒤로가기, 왼쪽, 오른쪽으로 가는 모션 등록
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController2DSimple : 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;
}
}
using System.Collections;
using System.Collections.Generic;
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"); // 위, 아래 방향키 입력
// shift 키를 안누르면 최대 0.5, shift 키를 누르면 최대 1까지 값이 바뀌게 된다
float offset = 0.5f + Input.GetAxis("Sprint") * 0.5f;
// horizontal 값에 따라 애니메이션 재생 (-1: 왼쪽, 0: 가운데, 1: 오른쪽)
animator.SetFloat("Horizontal", horizontal * offset);
// vertical 값에 따라 애니메이션 재생 (-1: 뒤, 0: 가운데,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;
}
}
using System.Collections;
using System.Collections.Generic;
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);
}
}
애니메이션 등록 (기다림)
transform에 관련 캐릭터의 Avatar 등록 -> Import skeleton 클릭 -> Use Node Name에서 사용할 정보만 체크한다
설정에서
Weight : 1
Mask : Face Avatar
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControllerDirect : 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;
}
}
}