경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220712 2022/04/04~2022/12/13

Jinho Lee·2022년 7월 12일
0

경일 메타버스 20220712 15주차 2일 수업내용. 유니티

리지드바디(Rigidbody)

  • 게임 오브젝트의 물리적 동작을 가능하게 하는 주요 컴포넌트

  • 리지드바디가 연결된 오브젝트는 중력이 바로 적용된다.

  • Collider 컴포넌트도 하나 이상 추가할 경우 게임 오브젝트가 당하는 충돌에 의해 움직인다.

  • Rigidbody 컴포넌트는 연결된 게임 오브젝트의 이동을 제어한다.

  • 스크립트에서 포지션과 회전 같은 트랜스폼(Transform) 프로퍼티를 변경하여 오브젝트를 이동하려고 하면 안된다.

    • 그 대신 Forces를 가하여 게임 오브젝트를 밀고 물리 엔진이 결과를 계산하도록 해야 한다.

콜라이더(Collider)

  • 물리적 충돌을 위해 게임 오브젝트의 모양을 정의하는 컴포넌트

  • 보이지 않는 콜라이더는 게임 오브젝트의 메시와 완전히 똑같을 필요는 없으며, 메시의 대략적인 근사치로도 효율적일 때가 많다.

  1. 기본 콜라이더 :
    가장 간단한, 그리고 프로세서에 부하를 주지 않는 콜라이더.
    3D - 박스 콜라이더, 스피어 콜라이더, 캡슐 콜라이더 등.
    2D - 박스 콜라이더 2D, 써클 콜라이더 2D 등.

  2. 복합 콜라이더 :
    기본 콜라이더로 구성.
    프로세서 부하를 낮게 유지하면서 게임 오브젝트의 대략적인 모양을 만들 수 있다.
    복합 콜라이더를 만들 때에는 하나의 Rigidbody 컴포넌트를 사용해야 하며 계층 구조의 루트 게임 오브젝트에 배치해야 한다.

  3. 메시 콜라이더 :
    게임 오브젝트의 메시 모양에 정확하게 맞출 수 있다.
    기본형보다 프로세서에 훨씬 더 큰 부하를 주므로 꼭 필요한 경우에만 사용해야 한다.
    메시 콜라이더는 Convex로 설정하지 않는 이상, 다른 메시 콜라이더와 충돌할 수 없다.

  4. 정적 콜라이더 :
    Rigidbody 컴포넌트 없이도 콜라이더를 게임 오브젝트에 추가하여 씬의 바닥, 벽, 기타 고정된 요소를 생성할 수 있다.
    ⇒ 동적 콜라이더 : 리지드바디가 있는 게임 오브젝트의 콜라이더

  5. 물리 머터리얼

  • 트리거(Triggers) :
    스크립팅 시스템은 충돌이 일어나는 시점을 감지하고 OnCollisionEnter 함수를 사용하여 액션을 초기화할 수 있다.
    콜라이더를 트리거(Trigger)(Is Trigger 프로퍼티 사용)로 설정하면 다른 콜라이더가 통과하도록 허용한다.
    다른 콜라이더가 이 콜라이더의 공간에 들어오면, 트리거는 트리거 오브젝트의 스크립트에 있는 OnTriggerEnter 함수를 호출한다.

스크립트에서 충돌 콜백

  • 충돌이 일어나면 물리 엔진은 충돌과 관련된 오브젝트에 있는 모든 스크립트에서 특정 이름을 가진 함수를 호출한다.

    1. 충돌이 감지되었을 때 가장 먼저 일어나는 물리 업데이트:
      OnCollisionEnter 함수 호출

    2. 접촉이 지속되는 상황에서의 업데이트: 
      OnCollisionStay 함수 호출

    3. 마지막으로 접촉 상태가 종료되었음: 
      OnCollisionExit 함수 호출

    4. 트리거 콜라이더의 경우 :
      OnTriggerEnterOnTriggerStay / OnTriggerExit
      함수를 호출

    5. 2D 물리의 경우 동일한 기능을 하는 함수를 제공하며, 함수의 이름에는 함수명 끝에 2D 첨자가 붙는다.

      • ex) OnCollisionEnter2D

콜라이더 상호작용

  • 콜라이더는 Rigidbody 컴포넌트의 환경 설정에 따라 서로 다르게 상호작용한다.

    • 세 가지 중요한 환경설정 :

      1. 정적 콜라이더(즉, 리지드바디가 없음)

      2. 리지드바디 콜라이더

      3. 키네마틱 리지드바디 콜라이더 등

    1. 정적 콜라이더

      • 콜라이더가 있지만 리지드바디는 없는 게임 오브젝트

      • 항상 같은 위치에 그대로 있으면서 절대로 움직이지 않는 레벨 지오메트리에 주로 사용된다.

    2. 리지드바디 콜라이더

      • 노멀 비키네마틱 리지드바디콜라이더가 있는 게임 오브젝트

      • 충돌과 힘반응한다.

    3. 키네마틱 리지드바디 콜라이더

      • 콜라이더와 키네마틱 리지드바디가 있는
        (즉, 리지드바디의 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 비교를 가급적 사용하지 마십시오.

프리팹(Prefab)

  • 원어 : 조립식 건물

  • 게임 오브젝트재사용 가능한 에셋으로 만든다.

  • 만드는 법 :
    Project 창의 Assets에 폴더를 만들거나 하고 게임 오브젝트를 그대로 끌어와 복사하면 Prefab이 생성된다.

  • Prefab 장점

    1. 복수의 복사된 오브젝트라도 Prefab 설정을 변경하는 것으로 한 번에 변경 가능

    2. 비슷한 오브젝트 여러 개를 만들 때마다 다시 설정하지 않아도 된다.

    3. 재사용이 편하다.

    4. 다른 씬에도 사용 가능하다.

  • Instantiate(Prefab) 함수 :
    Prefab을 복제한다, Prefab으로 인스턴스를 생성한다.

0개의 댓글