게임 세상에서 땅을 딛고 벽을 만나면 더이상 이동할 수 없는 등 가로막히는 현상이 있다. 이것은 각 물체에 Collider 라는 설정이 되어 있고 각각의 Collider 끼리 부딪히면 Collision 판정이 일어난다. Collision 판정이 일어났을 때 다양한 동작을 할 수 있기 때문에 충돌을 관리하는 것 역시 중요하다.
2. Collider
Player Object 가 땅을 딛도록 하기 위해서, 3D Object -> Plain 을 선택하여 땅을 만들어준다.
Plain 은 기본적으로 Mesh Collider 를 가지고 있는데, 평평한 땅의 충돌을 감지해주는 Collider 가 설정되어 있는 것이다.
Player Object 에는 Capsule Collider 를 설정해준다. Scene 편집 화면에서 케릭터의 충돌 범위를 지정해줄 수 있다. 이렇게 하면 Player Object 의 Capsule Collider 와 Plane 의 Mesh Collider 가 각각 충돌 범위가 지정되었고, 부딪히면 Collision 이 발생하게 되는 것이다.
하지만 땅을 디디기 위해선 중력이 작용해야 하는데, 유니티의 물리엔진을 적용하기 위해 Player Object 에 Rigidbody 컴포넌트를 달아준다. 내부 설정에 Use Gravity 를 Check 하면 중력을 받기 때문에 아래로 떨어지게 되고, Plane 의 Mesh Collider 와 부딪히게 된다. 물리 엔진이 적용되었기 때문에 부딪히면 쓰러지게 되는데, Constraints > Freeze Rotation 을 체크하면 해당 현상을 제거할 수 있다.
3. 충돌 테스트
땅을 디뎠지만 충돌을 테스트하기 위해 Cube 하나도 생성해준다. 역시 Box Collider 를 적용해 충돌을 감지 할 수 있게 해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestCollision : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
Debug.Log("Collsion!");
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
그리고 Unity 에서 제공하는 함수인 Collision 이 발생하면 실행되는 OnCollsionEnter 함수를 사용해서 CollisionTest 코드를 작성한다. 그리고 Player Object 에 이전에 작성했던 PlayerController 와 CollsionTest 스크립트를 적용해준다.
이제 케릭터 오브젝트를 움직여서 해당 Cube 와 충돌을 시키면 Console 에 Collsion ! 문구가 발생하는 것을 알 수 있다.
이런식으로 각 물체에 대해 Collider 를 설정하고, Collsion 이 발생했을 때에 대한 이벤트를 작성해주면서 게임을 제작할 수 있다.