현재 프로젝트에서 fail 트리거로 두고있는 box Collider를 Is Trigger로 두고 있는 상황에서,
새로운 오브젝트를 소환할때, 현재의 오브젝트는 처음에 공중에 띄워져 있는 상태에서 물리력을 적용받지 않는 상태로 두고, 컨트롤러를 이용해서 움직인뒤에 입력을 받아서 물리력을 적용받게 만드는 형태로 상황이 설정되어있는 상태였다.
이때에 코드를 통한 제어로 Rigidbody의 Is Kinematic 을 false에서 true로,
Box Collider의 Is Trigger를 true 에서 false 로 바꾸어서 컨트롤러의 입력을 받은뒤에 물리력을 적용받아 움직이도록 만들었느데,
이와같은 형태로 구현했을시에, 입력을 받고 물리력을 받게 만들었을시에 바로 fail 트리거로 작동하는 인스턴스에서
OnCollisionEnter() 메서드와 OnCollisionExit() 메서드가 동시에 작동하는 의도치 않은 상황이 발생하였다.
이때에 실험을 위해서 새롭게 큐브를 만들고, 해당 큐브에 현재 상황과 같은 Rigidbody와 BoxCollider를 붙인뒤에 경우의 수들을 이용한 실험을 해보았을때, 이와같이 의도치 않게 Exit과 Enter가 모두 발생하는경우는 Is Kinematic 의 설정을
true, false 반복할때마다 모두 두가지 CollsionExit과 CollisionEnter로 인지해버리는 문제점을 파악할 수 있었다.
현재 상황은 해당 트리거 콜라이더에 내가 정상 동작하기를 바라는 오브젝트가 겹쳐져서 바로 is Kinematic 으로 두고 초기 실행시에 Enter로 인지하는 상황인데, 이때에 바로 입력을 받아서 코드로 Is Kinematic을 체크해제 하면서 물리력을 적용받을 수 있도록 하면서 엔터와 엑시트에 의한 OnCollision 메서드가 동작하면서 의도치않게 시작과 동시에 fail 조건에 도달해서 비정상적인 종료가 이루어지고 있었다.
이렇듯 콜라이더끼리 이미 만나있는 상황에서, Is Kinematic을 건드리는것이 OnCollisionEnter와 OnCollsionExit 모두에 영향을 미쳐버리기 때문에, 이에 대한 내용을 잘 인지하고 이와같은 두가지 경우를 반대되는 상황에서 사용해야 하는 경우 Is Kinematic을 이용해서 제어할때 주의하도록 하자. 이번 경우는 컨트롤러로 제어하는 오브젝트에서 Is Trigger로 체크하면서 Collider의 영향을 받지 않는 오브젝트로 설정해서 시작하면서 그것을 코드로 다시 is Trigger를 해제하는 형태인데,
이러한 형태로 구현하지 말고, 그와같이 물리력의 영향을 받지 않으면서 Collider 의 기능을 제거하기 위해서는 제어하는 오브젝트에 Is Trigger를 체크하고 해제하는 형태가 아니라, Collider 자체의 활성화를 스크립트로 제어하고 Use Gravity를 활성화, 비활성화 하는 형태로 구현해보도록 하자. 내가 현재 원하는 형태에서는 그와 같은 구현이 해결하기 좋은 방법이었다.
Is Kinematic과 OnCollision 메서드는 반드시 주의해서 사용하도록 하자.
'Unity' 카테고리의 다른 글
Unity TMP 한글 출력 안될때 폰트 문제 해결 방법. (0) | 2024.03.05 |
---|---|
PlayerPrefs 를 이용한 배경음악 재생 컨트롤시에 주의해야할 Audio Source의 Play On Awake (0) | 2024.03.04 |
실험을 위해 스크립트 컴포넌트를 다른곳에 여러개 붙여두고 체크박스를 해제해놓았을 때의 문제점과 주의사항. (0) | 2024.02.28 |
OnCollisionEnter2D() 를 통한 동일 위치에 있는 동일 높이에 있는 물체에 동시 충격시 스크립트 실행 순서에 관한 실험. (0) | 2024.02.19 |
유니티 Simulator 상에서 마우스를 통한 입력의 처리. (*마우스로 Touch 입력을 받으려는 상황에서 주의사항*) (0) | 2024.02.18 |