캐릭터 애니메이션 4 (충돌 감지)
이번에는 캐릭터가 다른 객체와 충돌하는걸 감지하여 애니메이션을 실행하는걸 해보겠습니다.
1.Capsule Collider와 Cube 객체 추가
캡슐 콜라이더란 유니티에서 충돌이나 공간을 구분지어 주는 역할을 합니다.
따라서 캐릭터 객체에도 캡슐 콜라이더 추가가 필요합니다.
[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.충돌 애니메이션
충돌시에 애니메이션을 추가해 보겠습니다.
애니메이터 창으로 들어갑니다.
애니메이션중에 [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]이라는 모션이 실행되고,
어색하지 않기 위해 캐릭터가 약간 뒤로 밀리는 모션도 추가합니다.