Unity 분석

물체가 이동하면서 얇은 벽을 통과하는 경우

지영7130 2023. 1. 4. 02:54

 

 위 사진은 벽과 공에 모두 콜라이더와 Rigidbody를 넣었으나 서로 영향을 미치지 못한 상황이다. 이러한 현상이 왜 발생할까? 원인은 아래 코드에 있다.

 

using UnityEngine;

public class Move : MonoBehaviour
{
   void Update()
    {
        if(Input.GetKey(KeyCode.A))
        {
            transform.position += Time.deltaTime * new Vector3(-20, 0, 0);
        }
    }
}

 

 이 코드는 A 버튼이 눌렸을 때 1초에 -20만큼 좌측으로 공을 이동시키는 코드이다. 이때 벽이 너무 얇아 이동하는 도중에 벽을 지나쳐 버린 것이다. 이러한 문제를 해결하기 위해서는 여러가지 방법들이 있다. 그중 하나는 Raycast를 사용해서 앞에 있는 벽을 감지하는 방법도 있지만 이 글에서 다루지는 않을것이다.

 

 

1. AddForce

 

using UnityEngine;

public class MoveAddForce : MonoBehaviour
{
    private void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.A))
        {
            transform.GetComponent<Rigidbody2D>().AddForce(new Vector3(-50, 0, 0));
        }
    }
}

 

 위와같이 Rigidbody에 AddForce를 주면 간단히 해결된다. 하지만 AddForce에는 단점이 존재한다. (그래서 난 AddForce를 사용하는 것을 지양한다.)

 

 

 아래는 이전에 했던 프로젝트의 일부이다. 아래 사진에서 모든 공에 AddForce로 똑같은 힘을 주었다. 하지만 자세히 보면 매번 실행할 때 마다 다르게 실행된다. 이는 AddForce는 오브젝트의 좌표를 직접 지정해서 실행한 것이 아닌 힘을 주어 물리연산을 했기 때문에 일어난 일이다.

 

 

 이 프로젝트에서는 매번 공을 예상하지 못한 방향으로 보내기 위해 AddForce를 사용했지만 실행할때마다 매번 비슷한 결과를 보일 필요가 있을때는 사용하기 힘들다. 이렇게 AddForce는 예측하기 어려운 방향으로 작동하는 경우가 종종 생긴다. 그렇다면 AddForce를 사용하지 않고 물체를 이동시킬 때 얇은 벽도 인식하게 하려면 어떻게 해야할까?

 

 

2. CCD(연속 충돌 검사)

 유니티에는 CCD라는 것이 있다. CCD는 빠르게 움직이는 오브젝트가 다른 물체를 통과하지 못하게 하기 위해 만들어진 것이다. 이 CCD라는 것을 사용하면 어떻게 될까? 아래 사진에서 위 오브젝트는 CCD를 사용하지 않은것, 아래 오브젝트는 CCD를 사용한 것이다.

 

 

 CCD는 물체가 이동하기 전과 후 사이에 다른 오브젝트가 있는지를 체크해 얇은 벽을 통과하지 못하게 한다. 아래 사진은 유니티 공식문서에서 가져왔다. (https://docs.unity3d.com/kr/2020.3/Manual/ContinuousCollisionDetection.html)

 

 

그렇게 되면 아래 사진처럼 CCD를 사용한 오브젝트는 얇은 벽을 통과하지 않게된다.

 

 

 CCD를 사용하려면 어떻게 해야할까? 유니티 공식문서에서는 "스위핑 기반의 CCD를 사용하려면 인스펙터 창에서 RigidBody를 선택하고 Collision Detection  Continuous 또는 Continuous Dynamic 으로 설정합니다. 추측성 CCD의 경우 Collision Detection  Continuous Speculative 로 설정합니다." 라고 되어있다.

 Rigidbody에서 Collision Detection를 찾아 Continuous 또는 Continuous Dynamic으로 바꿔주면 된다.

 

 

하지만 CCD에는 주의할 점이 있다. 비용을 많이 차지한다는 것이다. 그래서 남용하면 최적화에 문제가 될 수 있다. 만약 빠르게 움직이는 물체가 얇은 벽을 체크해야 할일이 있다면 웬만해서는 RayCast를 사용하는 것을 추천한다.

 

CCD에 대해 더 자세히 알고싶다면 아래 링크에 들어가면 자세히 나와있다.

https://docs.unity3d.com/kr/2020.3/Manual/ContinuousCollisionDetection.html

'Unity 분석' 카테고리의 다른 글

Enum의 활용  (0) 2023.01.07
코루틴의 작동방식  (0) 2023.01.06
메모리 구조와 유니티 - GC에 대한 심층적 이해  (0) 2023.01.05
GameObject.Find()  (0) 2023.01.04
FixedUpdate  (0) 2023.01.04