[ OnTigger & OnCollision ]
OnCollision
Collider에 의한 충돌체크를 의미하는 만큼 충돌체 A와 B는 Collider를 가지고 있어야 함
또한 물성을 이용하고 있기 때문에, 충돌체 둘 중 하나는 Rigidbody를 가지고 있어야 하며, Rigidbody를 가지고 있는 쪽이 움직여야 함
충돌체 둘 중 하나의 Rigidbody에서 Iskinematic이 꺼져야 발생함
IsKinematic이 켜져있으면 충돌을 무시함(물리 연산을 안하기 때문에)
내부 파라미터로는 충돌된 Collision 변수가 들어옴
OnTrigger : OnCollision을 특화시킨 함수로 이해하는 것이 타당함
충돌체 A와 B는 Collider를 가지고 있어야 함
충돌체 둘 중 하나는 Rigidbody를 가지고 있어야 함
Collider의 IsTrigger가 켜져 있어야 함 (꺼져 있으면 두 충돌체간의 물리 연산을 하지 않으며, Collider를 지나가지 못함) :
IsTigger가 켜져있으면 Collision 관련 함수가 호출되지 않으며, Collider끼리의 충돌이 일어나도 무시함 (즉, Trigger의 의미에만 충실함)
즉, 주인공 캐릭터에 IsTrigger를 On 하는 것은 비합리적일 수 있음
내부 파라미터로는 충돌된 Collider 변수가 들어옴
OnTrigger/OnCollision의 Enter/Stay/Exit
~Enter : 충돌이 이루어지는 시점
~Stay : 충돌이 계속 진행중일 때
~Exit : 충돌이 끝나는 시점
Trigger의 특징
Trigger가 존재하면 우선적으로 OnTriggerXXX가 발생하며, OnCollisonXXX는 발생하지 않음(즉, 둘중에 하나만 발생)
부딪히는 두 오브젝트의 어느 하나가 Is Trigger가 On이 있으면, 둘 다 OnTriggerXXX()를 사용할 수 있음
Trigger / Collion 함수는 모두 yield 사용이 가능
Mesh Collider
Unity에서 기본적으로 Mesh Collider 는 다른 Mesh Collider와의 충돌 체크를 제공하지 않음
모든 폴리곤에 대한 충돌 연산이 필요하기 때문에 기본적으로는 제공을 하지 않음
정밀한 충돌 계산을 위해 Mesh Collider를 사용하기 위해서는 Mesh Collider의 Convex 속성을 On 해서 다른 Mesh Collider와 충돌 계산을 할 수 있도록 하고 있음(단, Mesh Collider의 폴리곤 개수가 255를 넘으면 안됨)
Collision & Trigger 테스트 소스
GameObject에 MyTrigger.cs 와 MyCollision을 삽입해서 사용
두개의 GameObject(Cube)를 만들어서 테스트
Collision
Rigidbody가 있는 경우와 없는 경우(물체를 이동해서 충돌 체크)
IsKinematic 테스트
Trigger
Rigidbody가 있는 경우와 없는 경우(물체를 이동해서 충돌 체크)
isTrigger 테스트(Collision 계열 함수가 처리되지 않는 것을 체크)
using UnityEngine;
using System.Collections;
public class MyTrigger : MonoBehaviour {
public int ID;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter : " + other.name);
//Destroy(this.gameObject);
}
void OnTriggerExit(Collider other)
{
Debug.Log("OnTriggerExit : " + other.name);
}
void OnTriggerStay(Collider other)
{
Debug.Log("OnTriggerStay : " + other.name);
}
}
using UnityEngine;
using System.Collections;
public class MyCollision : MonoBehaviour {
int n = 0;
public int ID;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("OnCollisionEnter : " + collision.collider.name);
//Destroy(this.gameObject);
}
void OnCollisionExit(Collision collision)
{
Debug.Log("OnCollisionExit : " + collision.collider.name);
}
void OnCollisionStay(Collision collision)
{
Debug.Log("OnCollisionStay : " + collision.collider.name);
//n++;
}
}