본문 바로가기

기초코딩강좌/유니티 기초 강좌

13. 충돌 감지와 반응

반응형

Unity에서 충돌 감지와 반응은 콜라이더와 리지드바디를 통해 구현됩니다. 아래는 충돌 감지와 반응을 구현하는 기본적인 방법에 대한 예시입니다.

1. 충돌 감지:

콜라이더와 리지드바디가 있는 두 오브젝트가 충돌하는 경우, Unity는 이를 감지하고 OnCollisionEnter, OnCollisionStay, OnCollisionExit 등의 이벤트를 호출합니다. 이를 활용하여 충돌 시 특정 동작을 수행할 수 있습니다.

using UnityEngine;

public class CollisionExample : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        // 충돌이 시작될 때 호출되는 메서드
        Debug.Log("충돌 시작: " + collision.gameObject.name);
    }

    void OnCollisionStay(Collision collision)
    {
        // 충돌이 지속될 때 호출되는 메서드 (프레임마다 호출)
        Debug.Log("충돌 중: " + collision.gameObject.name);
    }

    void OnCollisionExit(Collision collision)
    {
        // 충돌이 끝날 때 호출되는 메서드
        Debug.Log("충돌 종료: " + collision.gameObject.name);
    }
}

 

2. 충돌 시 반응:

충돌이 감지되면 해당하는 이벤트 메서드 내에서 특정 동작을 수행할 수 있습니다. 예를 들어, 다른 오브젝트에 힘을 가하거나 특정 스크립트의 메서드를 호출할 수 있습니다.

using UnityEngine;

public class CollisionResponse : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        // 충돌이 시작될 때 호출되는 메서드
        Debug.Log("충돌 시작: " + collision.gameObject.name);

        // 충돌한 오브젝트에 힘을 가하기
        Rigidbody otherRigidbody = collision.gameObject.GetComponent<Rigidbody>();
        if (otherRigidbody != null)
        {
            otherRigidbody.AddForce(Vector3.up * 500f);
        }
    }
}

 

이 코드에서는 충돌이 시작될 때 다른 오브젝트에 위쪽으로 힘을 가하고 있습니다. 이렇게 하면 충돌한 오브젝트가 위로 튀어오를 것입니다.

 

이외에도 다양한 방식으로 충돌 시 반응을 구현할 수 있으며, 스크립트의 메서드 호출, 물체의 속성 변경, 다른 게임 오브젝트와의 상호작용 등이 가능합니다.

 


3. 충돌 이벤트

Unity에서 충돌 이벤트는 주로 OnCollisionEnter, OnCollisionStay, OnCollisionExit와 같은 메서드를 통해 처리됩니다. 이들 메서드는 MonoBehaviour 클래스에서 파생된 스크립트 내에 작성됩니다. 아래에 각 이벤트 메서드에 대한 설명과 예시 코드를 제공합니다.

 

 

1) OnCollisionEnter:

OnCollisionEnter 메서드는 두 개의 Collider가 서로 처음으로 충돌했을 때 호출됩니다.

 

using UnityEngine;

public class CollisionExample : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        // 충돌이 시작될 때 호출되는 메서드
        Debug.Log("충돌 시작: " + collision.gameObject.name);

        // 충돌한 오브젝트에 대한 추가적인 작업 수행 가능
    }
}

 

2) OnCollisionStay:

OnCollisionStay 메서드는 두 개의 Collider가 서로 충돌하고 있는 동안 매 프레임마다 호출됩니다.

 

using UnityEngine;

public class CollisionExample : MonoBehaviour
{
    void OnCollisionStay(Collision collision)
    {
        // 충돌이 지속될 때 호출되는 메서드 (프레임마다 호출)
        Debug.Log("충돌 중: " + collision.gameObject.name);

        // 충돌한 오브젝트에 대한 추가적인 작업 수행 가능
    }
}

 

3) OnCollisionExit:

OnCollisionExit 메서드는 두 개의 Collider가 서로 더 이상 충돌하지 않을 때 호출됩니다.

using UnityEngine;

public class CollisionExample : MonoBehaviour
{
    void OnCollisionExit(Collision collision)
    {
        // 충돌이 끝날 때 호출되는 메서드
        Debug.Log("충돌 종료: " + collision.gameObject.name);

        // 충돌이 끝난 오브젝트에 대한 추가적인 작업 수행 가능
    }
}

 

이러한 메서드들은 충돌 이벤트에 대한 처리를 제공하며, 이벤트가 발생할 때 수행하고자 하는 동작을 추가로 구현할 수 있습니다. 이를 통해 게임 오브젝트 간의 상호작용, 충돌 시 발생하는 효과 등을 구현할 수 있습니다.

 

 


4. 충돌 레이어와 마스크

Unity에서 충돌을 관리하고 원하는 충돌 그룹을 설정하기 위해 "레이어(Layer)"와 "마스크(Mask)"를 사용할 수 있습니다. 레이어와 마스크는 게임 오브젝트의 물리 충돌 및 레이캐스트와 같은 상호작용에서 특정 그룹과의 상호작용을 정의하는 데 사용됩니다.

 

1) 충돌 레이어 (Layer):

레이어는 게임 오브젝트에 대한 물리 충돌 검사 시 특정 그룹으로 분류하는 데 사용됩니다. 오브젝트의 Inspector 창에서 "Layer" 속성을 통해 레이어를 설정할 수 있습니다.

레이어 설정:

  1. 레이어 추가:
    • "Edit" 메뉴 > "Project Settings" > "Tags and Layers"에서 새로운 레이어를 추가할 수 있습니다.
  2. 오브젝트에 레이어 할당:
    • 오브젝트의 Inspector 창에서 "Layer" 속성을 사용하여 레이어를 할당합니다.

2) 충돌 마스크 (Mask):

마스크는 특정 레이어와의 충돌만을 감지하도록 설정하는 데 사용됩니다. 이는 레이캐스트나 물리 충돌 검사 시에 해당 마스크를 가진 레이어와 상호작용하게 만듭니다.

마스크 설정:

  1. 마스크 설정:
    • "Edit" 메뉴 > "Project Settings" > "Physics"에서 "Layer Collision Matrix"에서 원하는 레이어 간의 충돌을 설정할 수 있습니다.
  2. 코드에서 마스크 사용:
    • 코드에서는 LayerMask를 사용하여 특정 레이어를 마스크로 지정할 수 있습니다.
using UnityEngine;

public class MaskExample : MonoBehaviour
{
    public LayerMask targetLayer;

    void Update()
    {
        // 레이캐스트를 통한 충돌 감지
        RaycastHit hit;
        if (Physics.Raycast(transform.position, transform.forward, out hit, 10f, targetLayer))
        {
            Debug.Log("충돌한 오브젝트: " + hit.collider.gameObject.name);
        }
    }
}

 

위 코드에서 targetLayer 변수를 통해 특정 레이어와만 충돌을 감지하도록 마스크를 설정합니다.

 

레이어와 마스크를 사용하면 게임에서 특정 그룹과의 충돌을 효과적으로 관리할 수 있습니다. 이를 통해 원하는 레이어 간의 상호작용을 조절하고, 충돌 검사 시 원하는 그룹만을 대상으로 할 수 있습니다.

 

 

 

 

728x90
반응형

'기초코딩강좌 > 유니티 기초 강좌' 카테고리의 다른 글

15. 메카님 시스템  (1) 2024.01.04
14. 애니메이션 기초  (1) 2024.01.03
12. 리지드바디와 콜라이더  (1) 2024.01.01
11. 프리팹 소개  (0) 2023.12.31
10. 씬(Scene)의 개념  (0) 2023.12.30