상세 컨텐츠

본문 제목

[Unity] 자주쓰는 함수_(2) 충돌

Unity

by 메타샤워 2023. 7. 19. 15:22

본문

게임을 진행하다보면 플레이어와 물체가 부딪쳐야 하는 경우가 발생한다. 다음 사항을 고려해보자
 
1. OnCollisionEnter
 
충돌체 간 충돌을 감지하여 충돌시 이벤트를 발생시킨다. Tag같이 물체를 구별할수 있는 식별자를 사용하자
void OnCollisionEnter(Collision other){
        if(other.transform.tag == "cube" || other.transform.tag == "door" ){  //충돌한 tag가 cube 또는 door 라면 JumpB가 참.
            JumpB = true;
        }
         
        if(other.transform.tag == "JumpUp"){
                        /* 1.5와 jump변수값을 곱한 힘의 백터 위의 방향으로 힘을 가함.*/
            rigidbody.velocity = Vector3.up * jump * 1.5f *Time.deltaTime;
        }
}
함수 내에서 rigidbody를 접근하면 스크립트가 포함된 객체에 물리를 적용시키는것이고
스크립트를 포함 시킨 객체와 부딪친 다른 객체에 접근 하고 싶으면 매개변수로 들어오는 other 변수를 이용하면 된다.
2. OnTriggerEnter
 
충돌체 간의 충돌을 감지하여 이벤트를 발생시킨다.  물체를 구별할수 있는 Tag와 Rigidbody를 입혀야 한다. 그리고 Collider의 is Trigger를 체크해야 명령 조건을 만족한다. 충돌체간의 충돌시 서로를 통과하게끔 해야 하기 때문에 투명한 Collider를 이용하는 것을 권장한다. 
ex) 플레이어의 체력을 회복할수 있는 회복 존 구현
void OnTriggerEnter(Collider other){
        if(other.transform.tag == "Player"){ //충돌한 물체 tag가 Player라면, End 씬으로 씬을 넘긴다.
            Application.LoadLevel("End");
        }
    }
is Trigger 체크가 된 물체에 Player가 접근하면 실행되는 명령이다.
 
 
3. Raycast
 
거리를 판단하고 명령에 맞는 수행을 하는것부터 시작해서 응용분야가 다양하다.
RaycastHit hit_0; // RaycastHit 선언.
void Update () {
        Vector3 ray_position = transform.position; //현재 위치.
        Vector3 ray_direction_R = transform.TransformDirection(1, 0, 0); //x값이 1, y값이 0,  z값이 0 방향.
 
            if(Physics.Raycast(ray_position, ray_direction_R, out hit_0, 0.51f)) // 0.5거리가 떨어져있는 위치에 닿는 다면.{
 
                if(hit_0.collider.tag == "Block_R"){ //Block_R tag라면 -0.75 위치로 이동한다. (접근을 제한한 것.).
                    float pos_x = hit_0.collider.transform.position.x -0.75f;
                    transform.position = new Vector3(pos_x, 0, transform.position.z);
                    transform.Translate (Vector3.right * h * Speed * Time.deltaTime);
                }
            }
}

 

4Raycast는 응용 분야가 다양하기 때문에 국한되어 사용하는 실수를 범하지 말자

 
물체간 충돌시 Rigidbody로 충분히 충돌을 감지하여 멈추게 할 수 있다.
실제로 유니티 안에서 Rigidbody를 사용할 경우, 부자연스러운 충돌이 연속적으로 발생하는것을 확인할수 있다.
 
 
4. AddComponent for Rigidbody
 
물체에 Rigidbody를 넣지않고 필요할 때만 잠깐 동안 Rigidbody를 물체에 넣어주는 것이다.  게임 실행시 시스템 리소스를 조금이나마 아낄 수 있다.
void AddRigidbody(){ //함수가 호출되면 Hierarchy 창 안에 있는 Box_s 안에 있는 box0~ 물체에 Rigidbody를 넣어준다.
    GameObject.Find("Box_s/box"+i).AddComponent("Rigidbody");
}

관련글 더보기