충돌 처리(1) - AABB
Rigidbody(강체)
유니티에서 게임 오브젝트에 추가 할 수 있는 컴포넌트중 하나이다
중력, 마찰등 물리학 적인 것들을 처리하는 용도로 쓰이는데
그 활용에는 충돌이 일어났을 때 처리하는 것도 있다
유니티의 충돌처리를 위한 준비
1. rigidbody 컴포넌트 - 이 오브젝트가 강체 물리에 영향을 받겠다 라는 처리가 되야함
2. collider(충돌의 형태)가 있어야함
게임오브젝트의 초록색 면들로 처리된 부분들, Collider는 물체의 외곽을 정의하고 물체가 다른 물체와 충돌하는지 여부를 판단한다.
큐브 모양의 오브젝트에는 Box Collider가 default로 붙게된다.
unity 3D에서의 충돌처리는 강체물리를 기본으로 하는데
강체 물리는 물체가 변형되지 않고 고정된 형태를 유지하는 물리적 모델.
즉, 물체의 형태나 크기가 변하지 않는다고 가정한다.
강체는 질량, 속도, 회전 등을 기반으로 힘과 토크에 반응하여 움직이며,
이를 통해 현실적인 물리적 상호작용을 구현할 수 있다.
※충돌처리는 비용이 비싼 친구이므로 최대한 적게 활용을 하는 것이 프로그램에 부하가 걸리지 않는다.
이를 알 수 있는 예시로 과거 탄막 슈팅게임 같은 경우
이렇게 플레이어 캐릭터에 탄이 피격이 된거 같지만 실제 피격 범위는 캐릭터의 정 중앙의 빨간점이 피격 범위로 설정이 되어 있다.
반면에 플레이어가 적을 공격 할 때 적의 피격범위는 플레이어 캐릭터에 비해 매우 넓게 측정이 되어 있다.
나는 최대한 피하고 적은 최대한 잘 맞추도록 하는 게임의 재미를 위하면서도 적은 충돌처리를 활용해 프로그램의 효용성을 높인 것이다.
이 처럼 과거의 탄막슈팅 게임은 collider와 같은 개념이라 볼 수 있는 충돌박스(bounding box)가 어떻게 활용되었는지를 보여주는 예시 라고 볼 수 있다.
rigidbody 컴포넌트는 3가지 방식으로 추가를 할 수 있는데
1. 유니티 엔진에서 직접 추가
2.
[RequireComponent(typeof(Rigidbody))]
을 이용한 추가
※RequireComponent : 컴포넌트 요청, 해당 '스크립트가 컴포넌트로 추가될 때 요청 컴포넌트도 같이 추가됨'
요청된 컴포넌트는 유니티창에서 지워지지 않는다.
사용시 해당 스크립트를 새로 추가할때 컴포넌트에 요청을 진행 하기에 개발자의 실수로 추가가 안 될수 있다.
3.AddComponent<Rigidbody>() 활용
private Rigidbody rb = null;
private void Awake()
{
//add : 없으면 컴포넌트를 추가해서 가져옴, 있으면 null
rb = gameObject.AddComponent<Rigidbody>(); //실행 할때만 추가가 됨(런타임에 추가 됨), 기획자가 바꿀 수 없다,
//프로그래머가 편하게 컴포넌트를 넣었다 빼는 용도
//addcomponent : 이미 컴포넌트가 있으면 null이 들어옴
//getcomponent : 해당 컴포넌트가 없다면 null이 들어옴
if(rb == null)
{
//get : 없으면 null, 있으면 해당 컴포넌트를 가져옴
rb = GetComponent<Rigidbody>(); //그래서 add와 get을 활용할때는 null값이 들어오지 않도록 해야함
}
}
충돌을 이제 어떻게 처리하는지 알아보자
AABB (Axis-Aligned Bounding Box)
AABB는 두 점(최소 점, 최대 점)으로 정의 되며 이 두 점은 직육면체의 대각선 끝을 나타낸다.
각 점들의 사이에 다른 collider의 점이 하나라도 들어왔느냐로 충돌을 검사함
점들의 축이 정렬되어 있어야 한다.
AABB는 계산이 간단하고 직관적이기 때문에 많은 게임 엔진에서 기본적인 충돌 감지 방법으로 사용되며
많은 객체가 있는 경우, AABB를 사용하여 충돌 가능성을 사전 필터링 할 수 있다.
예를들어
배틀 그라운드 같은 경우에는
머리, 목, 상체, 하체, 팔, 손, 발 등 여러 피격 부위가 존재하는데
이 부분들에 대한 collider가 각각 설정이 되어 있다.(대미지가 차별되어야 한다.)
심지어 유저뿐만 아니라 돌,땅,건물,차, 심지어 게임 아이템 중 하나인 연료통, 프라이팬 등 여러 부분에 피격 충돌처리가 되어있는 것은 물론이고 게임아이템을 습득 하기 위한 별도의 충돌처리 그리고 이 외에 언급되지 않은 다양한 충돌처리가 있을 것 이다.
이렇게 많은 충돌처리를 100명의 인원이 동시에 한다고 하면 바로 프로그램은 과부하가 걸리게 될 것인데
이를 캐릭터가 보는 시야각에만 충돌 처리가 발생 되도록 1차 필터링 하고
그리고 무기가 닿는 범위에만 충돌 처리가 발생 되도록 2차 필터링을 다시 한다.
배틀그라운드는 탄도학을 사용하고 있기에 무기에 대한 충돌처리는 상대적으로 쉽게 하는 것으로 예상된다.
이렇게 사전 필터링들을 거치면 한번에 처리해야 할 충돌처리는 줄어들게 되는 것이다.
그리고 이 AABB방식은 3차원으로 확장을 해도 개념이 같다
박스 2개를 겹치는 것과 큐브 2개를 겹치는 것에 큰 차이가 없다
x,y,z축을 기준으로 각 면의 사이에 다른 객체가 있는지 충돌을 검사한다.