유니티 충돌 인식 - yuniti chungdol insig

Unity 3D

[8강] unity3d 여러가지 충돌 인식 방법 Trigger, Collision, Raycast

저번 강의에서는 간단한 일반 충돌인  OnCollisionEnter 함수를 이용한 충돌 처리를 해봤습니다 ㅋㅋ

오늘은 그것 말고도 다른  충돌방식에 대해서 알아보도록 할꼐요 ㅋㅋㅋ

 OnCollisionEnter  함수는 Collider 에 물체가 충돌하면 자동으로 호출되는 ㅋㅋ 그러니까 실행되는 부분입니다 .

그리고 여기서 충돌에서 가장 중요한게 한가지 있습니다 

이것떄문에 제가 2시간을 고생을 했던 기억이 나네요 ^^*

꼬옥 아주 꼬옥 Rigidbody 을 컴퍼넌트로 추가해줘야합니다 !!! 아니면 충돌했을 때  충돌을 무시합니다 !!!!

오늘은 다른 충돌 방법을 알아볼게요 ㅋㅋ 그 첫번째가 Trigger 입니다 .

트리거와 일반 충돌과의 차이점은 일반 충돌은 충돌을 하면 팅겨나오거나 멈춰버립니다 

하지만 트리거는 충돌을 해도 멈추지 않고 해당 물체를 뚷고 지나갑니다 .

그러면 트리거는 어떤식으로 충돌을 인식하는지 볼게요 ㅋㅋㅋㅋ

충돌을 해도 뚷고 지나가면 왠진 충돌을 해도 무슨 소용인가 하실텐데요 ㅋㅋㅋ

그리고 또 왜 있나 ? 하시는 맘이 또 있을 겁니다 ㅋㅋ 왜 어렵게 저런걸  만들어 두었나 ㅋㅋ 

유니티에 짜증이 나시는 분도 있을텐데욬 ㅋㅋㅋㅋ 유니티는 처음부터 게임을 만들기 위해 만들어진 엔진입니다 .

트리거는 FPS에서 쓰입니다 . 눈치 채셨나요 ㅋ??

총알에 트리거를 적용하면 좋죠 ㅋㅋㅋ 원래 총알이 사람 몸에 맞으면 어찌 돼죠 ?

뚷고 나가죠 ㅋ?

물론 한명만 죽일수 있게 프로그래밍 된 게임도 있지만 요새는 뒤에 있는 사람도 뚷고 나간 총알이 맞추는 게임도 있습니다 .

총알 같은 게 사람 몸 맞고 팅겨 나오면 이상하겠죠 ㅋ??  

무슨 핸콕도 아니고 ㅋ? 그래서 뚷고 나가되 총알을 맞았다만 알려주는 역활으르 하게 됩니다 ㅋㅋ

그러면 일반 collider를 트리거로 바꾸어 보곘습니다 .

일단 캡슐을 추가 하고 보면 

컴퍼넌트중에 캡슐 콜린더가 있습니다 ㅋㅋㅋ

이게 있어야 충돌을 할때 충돌이 됩니다 ㅋㅋ

콜린더 즉 충돌체는 모양을 바꿀수도 있고 크기등을 바꿀수 있습니다 ㅋㅋ

바꾸는 방법이나 유니티 안에 있는 물체가 아니라 다른 프로그램에서 만든 3d모델을 사용할때 어떻게 

충돌체를 적용하는지는 다음강의 때 말씀 드리고 오늘은 

충돌의 종류에 대해 알아봅니다 ㅋ

총돌체 컴퍼넌트를 보면 ㅋㅋㅋ Is Trigger라는 항목이 있습니다 ㅋㅋ

위 사진의 빨간색 네모로 표시헀습니다 ㅋ

그걸 체크하면 우리가 지금 배우는 트리거로 변신을 하게 됩니다 ㅋ

그러면 트리거는 스크립트 상에서 어찌 인식하는 지 알아보겠습니다 

일반 충돌과는 함수가 다릅니다 

    void OnTriggerEnter(Collider col){

  GameObject test;

if(col.gameObject.tag=="bullet"){

//Destroy(col.gameObject);

}

}

다음과 같이 적어줍니다 OnCollisionEnter함수를 지워주고 위와 같이 적어줍니다 .

트리거가 충돌하면 OnTriggerEnter 함수를 부릅니다 

그리고 여기서 두 함수의 큰 차이가 있습니다 

전해주는 인자가 다릅니다 . 인자는 함수에게 전해주는 정보입니다 .

함수 뒤에 () 안에 있는 내용이 인자라고 합니다 .

 OnCollisionEnter 함수

 Collision

 OnTriggerEnter  함수

 Collider

 위와 같습니다 ㅋㅋ

나머지는 사용법이 같습니다 .

그러면 다음으로 Raycast 를 알아 볼텐데요 ㅋㅋ 이거는 또 머하는 녀석인가 ㅋㅋㅋㅋㅋ

이름만 가지고는 영어라서 알길이 없습니다 ㅋㅋ

이 녀석의 정체는 해당 물체의 근처의 특정 범위 안에 물건이 나타나면 알려주는 역확을 합니다

직접 충돌이 아니라는 점이 다른 충돌과 다릅니다 .

 void Update () {

RaycastHit h;

//움직이는 코드 

transform.position = new Vector3(transform.position.y+0.01F,0.92F,transform.position.z+0.01F);

                   //Raycast 코드 

if(Physics.Raycast(transform.position, transform.forward, out h, 5F)){

if(h.collider.gameObject.tag == "door"){

printf("근처에 문 있음 ")

}

}

}

Raycast 함수의 인자에 대한 설명을 드릴게요 ㅋㅋ 

 첫번째 인자

 충돌을 감지할 영역의 중심

 두전째 인자 

충돌의 감지할 방향  

 세번째 인자 

충돌정보  

 네번째 인자

 충돌을 감지할 범위 

 transform.forward는 +z 방향을 의미합니다 .

유니티에서는 +z를 앞쪽으로 보기때문입니다 .

세번째 인자를 이용해서 위와 같이 범위안에 누가 있는지 알아 채게 됩니다 .

이 충돌은 직접 충돌이 아니라 내 주위로 근처에 오기만 해도 인식하게 됩니다 .

이상으로 마치도록 하겠습니다