물리 충돌 이벤트를 알아보겠습니다.
크게 두가지 방식으로 나뉩니다.
1. 물리적 충돌 감지
- OnCollisionEnter : 물리적 충돌이 시작할 때
- OnCollisionExit : 물리적 충돌이 끝날 때
- OnCollisionStay : 물리적 충돌이 감지되고 있을 때
2. 콜라이더 겹침 감지
- OnTriggerEnter : 콜라이더 겹침이 시작할 때
- OnTriggerExit : 콜라이더 겹침이 끝날 때
- OnTriggerStay : 콜라이더가 겹치고 있을 때
물리적 충돌이란?
- 말 그대로 오브젝트와 오브젝트가 그냥 물리적으로 충돌하는 걸 말합니다.
콜라이더 겹침이란?
- 오브젝트엔 콜라이더 컴포넌트가 있습니다. 이 콜라이더가 다른 콜라이더와 겹쳤을 때를 말합니다.
우선 예제를 위해 스테이지를 만들었습니다.
OnCollisionEnter
Player 공이 다른 공과 충돌 했을 때 그 공의 색깔을 바꿔보는 걸로 하겠습니다.
우선 색깔을 바꿀 공들의 Material을 가져와야하는데, Material은 MeshRenderer안에 있으므로, 메쉬렌더러부터 가져옵니다.
소스코드
public class OtherBalls : MonoBehaviour
{
MeshRenderer mesh;
Material mat;
void Start()
{
mesh = GetComponent<MeshRenderer>();
mat = mesh.material; //Material은 MeshRenderer안에 있습니다.
}
void OnCollisionEnter(Collision collision) //매개변수로 충돌 클래스 제공, 충돌한 상대의 정보가 담겨있습니다.
{
if (collision.gameObject.name == "Player") { //조건문으로 충돌한 상대의 name 확인
mat.color = new Color(0, 0, 0); //Color는 Material안에 있습니다.
}
}
void OnCollisionExit(Collision collision)
{
if (collision.gameObject.name == "Player") {
mat.color = new Color(1, 1, 1);
}
}
}
인게임
OnTriggerStay
이번엔 Player 공이 큐브안에 들어가면 위로 떠오르는 동작을 만들어보겠습니다.
그리고 OnTrigger 함수들은 isTrigger을 체크해야만 동작합니다. 콜라이더 겹침 검사를 할 상대오브젝트의 콜라이더 컴포넌트에서 isTrigger을 체크합니다.
위의 경우는 상대 오브젝트가 Cube이니 Cube의 isTrigger을 체크해야겠네요.
소스코드
public class MyBall : MonoBehaviour
{
Rigidbody rigid;
void Start()
{
rigid = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 vec = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
rigid.AddForce(vec, ForceMode.Impulse);
}
void OnTriggerStay(Collider other) //겹친 상대 콜라이더의 정보를 가져옵니다.
{
if (other.name == "Goal") { //조건문으로 상대의 정보를 활용할 수 있습니다.
rigid.AddForce(Vector3.up * 2, ForceMode.Impulse); //AddForce를 위쪽 방향으로
}
}
}
인게임
'유니티 3D기본(Roll A Ball)' 카테고리의 다른 글
13. 공 굴리기 (0) | 2021.10.24 |
---|---|
12. 게임 인터페이스 만들기 (UGUI) (0) | 2021.10.22 |
10. 힘을 이용하여 물체 움직여보기 (velocity, addForce) (0) | 2021.10.14 |
9. 실체와 같은 물체 만들기 (5 컴포넌트) (0) | 2021.10.14 |
8. Time.deltaTime (델타타임) (0) | 2021.10.14 |