경일 메타버스 20220712 15주차 2일 수업내용. 유니티
게임 오브젝트의 물리적 동작을 가능하게 하는 주요 컴포넌트
리지드바디가 연결된 오브젝트는 중력이 바로 적용된다.
Collider 컴포넌트도 하나 이상 추가할 경우 게임 오브젝트가 당하는 충돌에 의해 움직인다.
Rigidbody 컴포넌트는 연결된 게임 오브젝트의 이동을 제어한다.
스크립트에서 포지션과 회전 같은 트랜스폼(Transform) 프로퍼티를 변경하여 오브젝트를 이동하려고 하면 안된다.
물리적 충돌을 위해 게임 오브젝트의 모양을 정의하는 컴포넌트
보이지 않는 콜라이더는 게임 오브젝트의 메시와 완전히 똑같을 필요는 없으며, 메시의 대략적인 근사치로도 효율적일 때가 많다.
기본 콜라이더 :
가장 간단한, 그리고 프로세서에 부하를 주지 않는 콜라이더.
3D - 박스 콜라이더, 스피어 콜라이더, 캡슐 콜라이더 등.
2D - 박스 콜라이더 2D, 써클 콜라이더 2D 등.
복합 콜라이더 :
기본 콜라이더로 구성.
프로세서 부하를 낮게 유지하면서 게임 오브젝트의 대략적인 모양을 만들 수 있다.
복합 콜라이더를 만들 때에는 하나의 Rigidbody 컴포넌트를 사용해야 하며 계층 구조의 루트 게임 오브젝트에 배치해야 한다.
메시 콜라이더 :
게임 오브젝트의 메시 모양에 정확하게 맞출 수 있다.
기본형보다 프로세서에 훨씬 더 큰 부하를 주므로 꼭 필요한 경우에만 사용해야 한다.
메시 콜라이더는 Convex로 설정하지 않는 이상, 다른 메시 콜라이더와 충돌할 수 없다.
정적 콜라이더 :
Rigidbody 컴포넌트 없이도 콜라이더를 게임 오브젝트에 추가하여 씬의 바닥, 벽, 기타 고정된 요소를 생성할 수 있다.
⇒ 동적 콜라이더 : 리지드바디가 있는 게임 오브젝트의 콜라이더
물리 머터리얼
충돌이 일어나면 물리 엔진은 충돌과 관련된 오브젝트에 있는 모든 스크립트에서 특정 이름을 가진 함수를 호출한다.
충돌이 감지되었을 때 가장 먼저 일어나는 물리 업데이트:
OnCollisionEnter
함수 호출
접촉이 지속되는 상황에서의 업데이트:
OnCollisionStay
함수 호출
마지막으로 접촉 상태가 종료되었음:
OnCollisionExit
함수 호출
트리거 콜라이더의 경우 :
OnTriggerEnter
/ OnTriggerStay
/ OnTriggerExit
함수를 호출
2D 물리의 경우 동일한 기능을 하는 함수를 제공하며, 함수의 이름에는 함수명 끝에 2D 첨자가 붙는다.
OnCollisionEnter2D
콜라이더는 Rigidbody 컴포넌트의 환경 설정에 따라 서로 다르게 상호작용한다.
세 가지 중요한 환경설정 :
정적 콜라이더(즉, 리지드바디가 없음)
리지드바디 콜라이더
키네마틱 리지드바디 콜라이더 등
정적 콜라이더
콜라이더가 있지만 리지드바디는 없는 게임 오브젝트
항상 같은 위치에 그대로 있으면서 절대로 움직이지 않는 레벨 지오메트리에 주로 사용된다.
리지드바디 콜라이더
노멀 비키네마틱 리지드바디와 콜라이더가 있는 게임 오브젝트
충돌과 힘에 반응한다.
키네마틱 리지드바디 콜라이더
콜라이더와 키네마틱 리지드바디가 있는
(즉, 리지드바디의 IsKinematic 프로퍼티가 활성화된)
게임 오브젝트
Transform 컴포넌트를 수정하여 스크립트를 통해 움직일 수 있다.
충돌이나 힘에 반응하지 않는다.
상황에 따라 움직이거나 활성화/비활성화되지만 그 외 상황에서는 정적 콜라이더처럼 동작하는 콜라이더에 사용한다.
표는 오브젝트에 있는 컴포넌트에 따라 어떤 이벤트 함수가 호출되는지를 보인다.
OnCollisionXXX V.S. OnTriggerXXX
매개변수
OnCollision (Collision) :
충돌이 있는가
OnTrigger (Collider other) :
다른 트리거 콜라이더와 접촉했는가
- tag로 체크
ex)
private void OnTriggerEnter(Collider other) if (other.tag == "Bullet") { Die(); } // 다른 콜라이더의 태그명으로 체크
- null 체크
ex)
private void OnTriggerEnter(Collider other) if (null == other.GetComponent<Bullet>()) { // GetComponent한 결과가 null이니 // other은 Bullet이 아님. }
?. 연산자
(expression)?. ~ : expression이 null이 아니면 멤버에 접근함.
- null 체크와 동일한 의미.
주의 : null 체크는 성능에 큰 영향을 미치므로 루프나 반복되는 코드에서는 사용하지 말 것.
- 인스턴스에서 메서드를 호출하면 실제로는 엔진 코드로 호출되기 때문에 룩업 및 확인을 수행하여 스크립트 레퍼런스를 네이티브 레퍼런스로 전환해야 합니다.
- 크기는 작지만 이 유형의 변수를 null과 비교하는 것은 순수 C# 변수에 대해 비교하는 것보다 훨씬 더 많은 성능이 소모됩니다.
- 따라서 빠른 루프에서 또는 프레임마다 실행되는 코드에서는 null 비교를 가급적 사용하지 마십시오.
원어 : 조립식 건물
게임 오브젝트를 재사용 가능한 에셋으로 만든다.
만드는 법 :
Project 창의 Assets에 폴더를 만들거나 하고 게임 오브젝트를 그대로 끌어와 복사하면 Prefab이 생성된다.
Prefab 장점
복수의 복사된 오브젝트라도 Prefab 설정을 변경하는 것으로 한 번에 변경 가능
비슷한 오브젝트 여러 개를 만들 때마다 다시 설정하지 않아도 된다.
재사용이 편하다.
다른 씬에도 사용 가능하다.
Instantiate(Prefab) 함수 :
Prefab을 복제한다, Prefab으로 인스턴스를 생성한다.