캐릭터 애니메이션 3 (객체 움직이기)

이번에는 키패드 움직임에 따라 캐릭터도 따라 이동하도록 해보겠습니다.
지난 시간 예제에 이어서 진행합니다.

1.애니메이터 수정

기존 소스에서는 키패드로 움직일시 모션이 발생하지만 움직임이 멈추면 캐릭터가 멈추지 않습니다.
이 기능을 추가해보겠습니다.
[WALK00]에서 [WAIT00]으로 돌아가야 하므로, [WALK00]에서 트랜지션을 만들어서 [WAIT00]으로 연결시킵니다.
이전에 했던것처럼 조건을 추가해주면 되는데 v의 값이 0일때 조건을 만들어 주면됩니다.

ani

[1]에서 트랜지션을 추가해주고 [2]에서 조건을 설정하였습니다.
이 트랜지션도 [Has Exit Time] 옵션을 해제해 줍니다.

2.rigidbody 추가

우선 이동하려는 캐릭터에 [rigidbody]를 추가해야 합니다.
[rigidbody]는 객체를 사실적으로 움직이도록 해줍니다.
객체의 중력 적용, 충돌 적용이 이에 포함됩니다.
ani
[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);


    }
}

게임을 실행해보면 방향키의 움직임에 따라 캐릭터가 움직이는것을 확인할 수 있습니다.

완성화면

ani