캐릭터 애니메이션 3 (객체 움직이기)
이번에는 키패드 움직임에 따라 캐릭터도 따라 이동하도록 해보겠습니다.
지난 시간 예제에 이어서 진행합니다.
1.애니메이터 수정
기존 소스에서는 키패드로 움직일시 모션이 발생하지만 움직임이 멈추면 캐릭터가 멈추지 않습니다.
이 기능을 추가해보겠습니다.
[WALK00]에서 [WAIT00]으로 돌아가야 하므로, [WALK00]에서 트랜지션을 만들어서 [WAIT00]으로 연결시킵니다.
이전에 했던것처럼 조건을 추가해주면 되는데 v의 값이 0일때 조건을 만들어 주면됩니다.
[1]에서 트랜지션을 추가해주고 [2]에서 조건을 설정하였습니다.
이 트랜지션도 [Has Exit Time] 옵션을 해제해 줍니다.
2.rigidbody 추가
우선 이동하려는 캐릭터에 [rigidbody]를 추가해야 합니다.
[rigidbody]는 객체를 사실적으로 움직이도록 해줍니다.
객체의 중력 적용, 충돌 적용이 이에 포함됩니다.
[rigidbody]를 추가한뒤 객체의 [Animator] 옵션중 [Apply Root Motion]을 해제해 줍니다.
이는 스크립트 자체에서 객체의 위치와 회전을 컨트롤 할 수 있게 해줍니다.
3.소스 수정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MainController : MonoBehaviour {
public Animator animator;
public Rigidbody rigidbody;
// 수평과 수직, 방향키 정보
private float h;
private float v;
private float moveX;
private float moveZ;
private float speedH = 50f;
private float speedZ = 80f;
// Start is called before the first frame update
void Start() {
animator = GetComponent<Animator>();
rigidbody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update() {
if (Input.GetKeyDown(KeyCode.Space))
{
animator.Play("JUMP00", -1, 0);
}
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
animator.SetFloat("h", h);
animator.SetFloat("v", v);
// 방향키 체크 후 이동할 거리 측정
moveX = h * speedH * Time.deltaTime;
moveZ = v * speedZ * Time.deltaTime;
// 뒤로 이동시 옆으로 이동 불가하게 처리
if (moveZ <= 0)
{
moveX = 0;
}
// Vector3 객체 색성후 velocity에 할당
rigidbody.velocity = new Vector3(moveX, 0, moveZ);
}
}
게임을 실행해보면 방향키의 움직임에 따라 캐릭터가 움직이는것을 확인할 수 있습니다.