ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Godot 게임개발] Collision Objects, Layers, Masks
    개발/GameDev 2024. 6. 11. 19:17
    반응형

     

    튜토리얼을 따라가다보니 Player는 Area2D를 사용한 반면 Mob은 RigidBody2D를 사용하더라.

    Collision Layer와 Collision Mask 라는 개념도 둘다 있길래

    어떤 개념이고 뭐가 다를까? 해서 관련된 공식 문서를 찾아보았다.

     

     

    Collision objects

     

    Coliision objects에는 4가지가 있는데,

    - Area2D
    - StaticBody2D
    - RigidBody2D
    - CharacterBody2D

    가 그것들이다.

    이 네 가지 objects는 모두..
    - PhysicBody2D 노드에 속하는 노드들이고.
    - CollisionObject2D 노드를 가진다.

     

    Area2D
    : 다른 오브젝트와 겹치는 것을 감지하고 시그널을 내뱉을 수 있다.
    중력계수(gravity)와 감쇠계수(damping)와 같은 물리속성을 오버라이드할 때도 쓰인다.
    또한 Area2D는 마우스 및 터치스크린 입력도 받는다.

     

    StaticBody2D
    : 움직이지 않는 물체에 적합하다.
    충돌 관계성에 참여하지만, 충돌에 따라 움직이거나 하지는 않는다.
    주로 환경 오브젝트와 같은 정적인 것들에 적용된다.

     

    RigidBody2D
    : 물리적인 시뮬레이션이 필요한 오브젝트에 쓰인다.
    RigidBody2D가 적용된 오브젝트는 직접적으로 컨트롤할 수 없다.
    다만 이 오브젝트에 어떠한 힘을 가할 때 (중력이나 충격 등) 물리엔진이 그 움직임을 계산하여 적용한다.

    RigidBody는 한동안 쉬는 상태가 지속되면 '잠들게' 된다. 잠든 RigidBody는 StaticBody 처럼 작용하며, 그 힘은 물리 엔진에 의해 계산되지 않는다. 충돌 혹은 코드를 통해 힘이 가해지면 '깨어나게' 된다.
    그러므로 RigidBody를 잘 활용하여 컴퓨팅 자원을 아낄 수 있도록 해야겠다.

    또한 RigidBody를 직접 컨트롤하려고 한다면, 주의해야한다. RigidBody의 물리 관련 속성을 조작하려는 경우, _physics_process() 대신에 _integrate_forces()를 사용해야한다. 이를 위해선 PhysicsDirectBodyState2D에 접근해야 한다. 이를 통해 물리 관련 속성을 안전하게 바꿀 수 있고 물리엔진과 잘 동기화될 수 있다.

    즉, RigidBody에 속하는 오브젝트의 물리 속성인 linear_velocity 또는 angular_velocity 등을 직접 설정하는 것이 아니라 코드단계에서 오브젝트에 적용되는 힘 (thrust나 torque 같은)을 물리 엔진이 계산하게 만든다는 것이다.

    다만, RigidBody가 잠들어있을 때는 _integrate_forces() 함수는 호출되지 않는다는 것을 감안해야한다. 이를 억지로 활성화시키려면 collision을 인위적으로 만들 수도 있겠지만, 이것은 퍼포먼스에 안 좋을 영향을 줄 것이다.

     

    CharacterBody2D
    : 충돌을 감지하지만 물리적인 계산이 필요없는 경우에 해당한다.
    모든 움직임과 충돌은 코드로써 그 결과를 반영한다.

    CharacterBody를 움직일 때 position 값을 직접 세팅해서는 안된다. 대신 move_and_collide()나 move_and_slide() 함수를 쓸 수 있다.

    move_and_collide()
    : 충돌 정보나 충돌하는 대상에 대한 정보를 담은 KinematicCollision2D 오브젝트를 내뱉는 함수이다.
    이 함수를 사용해서 CharacterBody 오브젝트의 충돌이 일어났을 때 그 반응을 결정할 수 있다.

    move_and_slide()
    : Sliding은 탑다운 게임에서 플레이어가 벽을 따라 걷는다던가 플랫포머 게임에서 위아래로 이동한다던지같은 좀 더 일반적인 충돌반응을 다룰 때 쓰이는 함수이다. (주로 미끄러져 가는 느낌)
    move_and_slide()는 많은 코드를 쓰지 않고도 미끄러지는 움직임을 편리하게 구현할 수 있다.

    move_and_slide()sms timestop을 계산에 자동으로 반영하므로, velocity vector를 delta에 곱할 필요도 없고 해서도 안된다.

     

     

    Collision Layers and Masks

    여러 오브젝트들의 충돌 상호관계를 다루기 위해 존재한다.

    Coliision Layers
    : 현재 노드가 어떤 충돌 속성을 가지는지 설정한다.
    기본 값 1.
    32개의 Collision Layes까지 설정할 수 있는데,
    각각 Preject Settings에서 Layer의 이름을 지정하여 편리하게 유형을 확인할 수 있다.

    Collision Masks
    : 현재 노드가 어떤 충돌 속성을 가진 오브젝트와 충돌할 것인지 설정한다.
    기본 값 1.
    아무것도 설정되지 않으면 무엇과도 충돌하지 않는다.

     

    반응형

    댓글

Designed by Tistory.