캐릭터 애니메이션 4 (충돌 감지)

이번에는 캐릭터가 다른 객체와 충돌하는걸 감지하여 애니메이션을 실행하는걸 해보겠습니다.

1.Capsule Collider와 Cube 객체 추가

캡슐 콜라이더란 유니티에서 충돌이나 공간을 구분지어 주는 역할을 합니다.
따라서 캐릭터 객체에도 캡슐 콜라이더 추가가 필요합니다.

ani

[Add Component]에서 [Capsule Collider]를 검색하여 추가해줍니다.
[Rigidbody] 옵션에서 중력 사용을 체크하고, 캐릭터가 회전하지 않도록 [Freeze Rotation] 을 모두 체크합니다.
추가한 [Capsule Collider] 옵션중 [Edit Collider]를 선택한 뒤, 캐릭터를 감싸고 있는 캡슐의 크기를 캐릭터만큼 키워줍니다.
충돌할 물체인 [Cube] 오브젝트를 추가하고 [Rigidbody] 컴포넌트 추가와 무게값으로 3을 주도록합니다.
추가된 큐브와 캐릭터의 거리를 약간 벌려주고 카메라도 잘 보일수 있게 조절합니다.

2.충돌 감지

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 = 200f;
    private float speedZ = 400f;

    // 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);


    }

    // 충돌 발생하는 시점
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "Cube")
        {
            Debug.Log("충돌 감지");
        }
    }
    // 충돌이 발생하는 동안
    private void OnCollisionStay(Collision collision)
    {
        if (collision.collider.tag == "Cube")
        {
            Debug.Log("충돌 유지");
        }
    }
    // 충돌이 끝난 뒤
    private void OnCollisionExit(Collision collision)
    {
        if (collision.collider.tag == "Cube")
        {
            Debug.Log("충돌 종료");
        }
    }

}

캐릭터가 충돌하는 시점에 여러가지 이벤트를 실행할 수 있습니다.
Debug.log를 통해 여러가지 시점에 로그가 찍히는걸 확인할 수 있습니다.

3.충돌 애니메이션

충돌시에 애니메이션을 추가해 보겠습니다.
애니메이터 창으로 들어갑니다.

ani

애니메이션중에 [DAMAGED01] 애니메이션을 애니메이터 창에 추가하고,
[Make Transition]으로 [WAIT00]과 연결합니다.

소스 수정

    // 충돌 발생하는 시점
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "Cube")
        {
            Debug.Log("충돌 감지");
            animator.Play("DAMAGED01", -1, 0);
            this.transform.Translate(Vector3.back * 50f * Time.deltaTime);
        }
    }

충돌이 발생하는 시점에 [DAMAGED01]이라는 모션이 실행되고,
어색하지 않기 위해 캐릭터가 약간 뒤로 밀리는 모션도 추가합니다.

완성화면

ani