[Unity3D] Rigidbody와 Mesh Collider, 그리고 Prefab
§ Rigidbody란?
Object에 물리 효과를 적용시키기 위해 사용하는 것. Gravity, Mass 등의 값을 조절하여 현실과 비슷한 물리효과를 낼 수 있다.
아래의 코드를 통해 Player에 부착된 Rigidbody Component를 가져올 수 있다.
Transform Component와 달리, Rigidbody는 Object에 기본적으로 붙어있지 않으므로 GetComponent 등과 같은 메서드를 통해 가져와줘야 한다.
private Rigidbody playerRb; // get rigidbody of the player
void Start()
{
// player에 부착된 Rigidbody Component 가져오기
playerRb = GetComponent<Rigidbody>();
}
Rigidbody의 대표적 메서드의 예로, Player가 점프 시 사용하는 Addforce가 있다.
Addforce(Vector3 force, Forcemode mode)는 Forcemode의 종류에 따라 미세한 차이가 있다.
Forcemode | 기능 | 사용 예 | mass 사용 여부 |
Force | Rigidbody에 질량을 이용해 지속적 힘 추가. | 연속적인 힘을 주고자 할 때, 이미 움직이고 있을 때 사용 ex) 자동차가 엑셀을 밟아 속력을 높일 때 |
O |
Acceleration | Rigidbody에 질량을 무시하고 지속적 가속 추가. | X | |
Impulse | Rigidbody에 질량을 이용해 즉각적 추진력 추가. | 순간적인 힘을 주고자 할 때, 정지 이후 움직일 때 사용 ex) 가만히 있다가 점프, 대기하다가 출발 등 정지 상태에서 다시 움직이려고 할 때 |
O |
VelocityChange | Rigidbody에 질량을 무시하고 즉각적 속도 추가. | X |
§ Mesh Collider란?
시뮬레이션 된 world에서 Rigidbody 가 적용된 두 물체가 충돌하거나 지면 등과 부딪혔을 때 충돌함을 알릴 수 있음
만약 한 물체의 Mesh Collider를 해제한다면, 해당 물체는 충돌 효과를 받지 않고 통과된다.
rigidbody와 mesh collider 설명은 추후 가능하다면 추가 예정!
§ Prefab이란?
이전 글에서도 설명했듯이, 하나의 GameObject 등을 재사용하고 싶을 때 오브젝트를 prefab화하여 사용가능하다. prefab화 한 기본 GameObject에 적용되어 있는 scale, script 등이 모두 동일하게 적용된다.
Prefab을 만들고자 하여 Asset > Prefabs 폴더를 만들고 해당 GameObject를 폴더에 넣었을 때, 다음과 같은 팝업이 뜬다.
이 때, Original Prefab을 선택할 경우 완전히 새로운 Prefab을 만들 수 있고,
Prefab Variant를 선택할 경우 하나의 기본 형태 prefab을 가지고 다양한 변형 형태를 만들 수 있다.
예를 들어, 동물의 숲 기본 나무를 Prefab Variant로 만든다고 가정했을 때,
복숭아나무, 배나무, 사과나무, 체리나무, 돈나무 등 기본적으로는 다 나무이지만 다양한 variant를 만드는 것이 가능하다.
예시로, Player에게서 계속 나가는 pizza를 prefab화 하여 사용하고자 할 때,
playerController.cs에서
public GameObject pizza;
로 선언한 후 Inspector 창에 해당 prefab을 드래그앤드롭하여 놓는다면
항상 Prefabs 폴더 내에 있는 pizza prefab이 생성된다.
이 때 주의해야 할 점이 있는데, 하이어라키에 존재하는 pizza object(이미 Scene에 존재)를 드래그앤드롭 한다면,
이미 Scene에 있는 pizza를 계속하여 생성하게 된다.
이럴 경우 추후 많은 양의 pizza를 생성해야 한다면 문제가 발생할 수 있다.
- 유지 보수와 일관성 유지의 어려움 :
만약 개발 중 복제된 pizza object의 속성을 하나 잘못 변경할 경우, 추후 이를 찾아 하나하나 수정하기 어렵다.
그러나 prefab을 사용하면 object들이 모두 동일한 특성과 스크립트를 지니게 되어 유지보수 및 일관성 관리가 쉽다. - 성능 저조 및 자원 낭비 :
GameObject를 하나하나 다 복제하는 경우, 각 instance마다 메모리와 자원을 각각 사용한다.
이는 성능의 저조와 자원의 낭비로 이어진다. 허나 Prefab를 이용한다면, 여러개의 instance가 자원을 공유한다.