Unity 검색

Setup for some moving platforms: Hero image
Setup for some moving platforms: Hero image
공유

Is this article helpful for you?

Thank you for your feedback!

Unity용 ECS가 사전 릴리스된 이후 Unity Physics는 1.0.0-pre.22부터 모터를 지원해 왔습니다. Unity Physics에서 모터란 조인트를 정의하는 제약 중 하나가 타겟으로 이동하기 위해 구동력을 발휘하는 조인트의 한 유형입니다. 이 타겟은 모터가 항상 특정 위치로 이동하도록 하는 위치 기반 타겟일 수도 있고 모터가 특정 속도를 유지하도록 하는 속도 기반 타겟일 수도 있습니다. Unity Physics는 위치 기반 유형 2개와 속도 기반 유형 2개로 총 4가지 유형의 모터를 지원합니다.

  1. 회전 모터: 타겟 각도 위치로 힌지형 조인트를 구동
  2. 각속도 모터: 축을 중심으로 타겟 각속도로 힌지형 조인트를 구동
  3. 위치 모터: 타겟 위치를 향해 구동
  4. 선형 속도 모터: 타겟 속도를 향해 구동

각 모터는 Unity PhysicsHavok Physics for Unity에서 지원됩니다.

모터 유형

각 모터 유형을 자세히 살펴보기 전에, GitHub의 PhysicsSamples 프로젝트에서 데모를 확인할 수 있으며 자세한 내용은 Unity 기술 자료에서 확인할 수 있습니다. 기술 자료에는 게임 오브젝트, C# 스크립트, Unity Physics Custom Authoring 컴포넌트를 사용하는 등 다양한 방식으로 각 모터를 설정하는 방법에 대한 설명이 담겨 있습니다.

회전 모터

회전 모터는 힌지형 조인트가 타겟 각도를 향해 구동하는 모터입니다. 모터의 동작은 각도 스프링 조인트와 비슷합니다.

회전 모터를 개발할 때 고려했던 사용 사례 중 하나는 저절로 닫히는 반자동문이었습니다. 다른 사용 사례로는 중력에 저항하는 특정 각도 유지를 예로 들 수 있습니다.

저절로 닫히는 반자동문을 설정하려면 문 게임 오브젝트Hinge Joint 컴포넌트에서 Connected Body 파라미터에 정적 리지드바디인 Wall을 사용해야 합니다. 원하는 위치 기반 모터 동작을 구현하려면 Use Spring을 활성화하고 속도 기반 모터를 만드는 Use Motor를 비활성화해야 합니다.

Figure: Inspector settings of a Hinge Joint that is configured as a swinging door with a Target Position of 0 degrees and a Break Torque of 900.
그림: 인스펙터에서 Target Position이 0이고 Break Torque가 900인 반자동문으로 설정된 Hinge Joint의 설정값

각속도 모터

반자동문을 회전문으로 바꾸고 싶다고 가정해 보겠습니다. 그러면 위치가 아닌 속도를 타게팅해야 합니다. 모터가 있는 원통형 게임 오브젝트를 부모 바디로 사용하고 그 주위에 큐브 게임 오브젝트를 추가해서 문을 만들면 됩니다.

Hinge Joint를 각속도 모터로 만들기 위한 설정값을 아래에서 확인해 보세요.

Figure: Inspector settings of a Hinge Joint that is configured as a revolving door with a Target Motor Velocity of 90 degrees/s and a Motor Force of 1000, which is the maximum force the motor can exert.
그림: 인스펙터에서 Motor의 Target Velocity가 90이고 모터가 가할 수 있는 최대 힘인 Force가 1,000인 회전문으로 설정된 Hinge Joint의 설정값

위 동영상을 보면 모터를 회전 방향이나 반대 방향으로 밀어서 모터 시뮬레이션에 영향을 줄 수 있음을 알 수 있습니다. 이 예시는 Motor Force를 1,000으로 설정한 결과물입니다. 이 값을 무한으로 설정하면 모터에 영향을 줄 방법이 없습니다.

위치 모터

위치 모터는 타겟 위치를 향해 구동하는 프리즘형 조인트입니다. 이 모터 유형은 스프링 조인트와 매우 비슷하게 동작합니다. 스프링과 비슷한 동작이 필요하지만 스프링을 특정 위치에 놓고 싶은 경우에 위치 모터가 적합할 수 있습니다. 또 다른 사용 사례로는 움직이는 플랫폼이나 미닫이문이 있습니다. 여기서는 움직이는 플랫폼을 만든다고 가정하겠습니다.

Figure: Setup for some moving platforms
그림: 움직이는 플랫폼을 위한 설정

위치 모터를 설정하려면 Configurable Joint를 사용해서 Target Position, X Drive: Position SpringX Drive: Maximum Force 필드를 설정하면 됩니다. 다음은 왼쪽 플랫폼이 오른쪽으로 이동하기 위한 Configurable Joint 설정입니다.

Figure: Configurable Joint settings to make a position motor that moves from left to right.
그림: 왼쪽에서 오른쪽으로 움직이는 위치 모터를 만들기 위한 Configurable Joint 설정값

이 동영상에서는 Position Spring 필드를 설정했음에도 플랫폼이 타겟 위치에 도착하면 튕기는 모습을 볼 수 있습니다. 이러한 현상이 일어나는 이유는 인스펙터를 통해 모터를 저작(authoring)할 때 스프링 및 감쇠 파라미터에 Unity Physics 기본값을 사용하기 때문입니다.

현재는 스크립팅을 통해 모터를 만들고 SpringFrequencySpringDamping을 직접 설정해서 이 문제를 해결할 수 있습니다. 이러한 유형의 모터는 스크립트로 저작하는 것이 특정 프로젝트용 코드를 더 유연하게 사용한다는 점에서 좋은 방법일 수 있습니다. 스프링 및 감쇠 파라미터를 설정하거나 모터가 방향을 변경하기 전에 지정된 시간만큼 대기하도록 구현할 수 있습니다.

선형 속도 모터

선형 속도 모터는 일반적으로 로켓의 추진기에 사용되지만 기차나 플랫폼 외에도 모든 구동 장치에 사용할 수 있습니다.

이 예시에서는 기본 셰이프로 간단한 로켓을 두 개 만들고 원통형 바디에 Configurable Joint를 추가했습니다. 오른쪽으로 이동하는 로켓의 질량은 10kg이고 타겟 속도는 3m/s이며, 왼쪽으로 이동하는 로켓의 질량은 20kg이고 타겟 속도는 4m/s입니다.

아래 스크린샷은 오른쪽으로 이동하는 로켓의 파라미터입니다. Configurable Joint의 모든 옵션이 한 화면에 표시되지 않았지만 표시되지 않은 옵션은 기본 설정을 수정하지 않고 사용했습니다. 주의 깊게 확인해야 할 파라미터인 Target Velocity는 -3, 0, 0m/s로 설정했습니다. 타겟의 부호는 바디가 이동할 위치를 기준으로 설정되므로 음의 부호를 사용해야 로켓이 앞으로 움직입니다.

X Drive 설정에서 Position Damper는 10으로 임의 설정하고 Maximum Force는 2,000으로 설정합니다. 왼쪽으로 이동하는 로켓의 Maximum Force는 1,000입니다. 이 값의 차이는 모터가 밀리는 정도에 영향을 줍니다. 예를 들어 오른쪽으로 움직이는 로켓의 Maximum Force를 무한으로 설정하면 도중에 부딪히더라도 원래의 경로를 유지합니다. 반면 왼쪽으로 움직이는 로켓은 옆으로 밀려나게 됩니다.

Figure: Settings of a Configurable Joint used to create a linear velocity motor.
그림: 선형 속도 모터를 만드는 데 사용한 Configurable Joint 설정값

향후 계획

Unity Physics를 사용하면 다양한 사용 사례를 구현하는 데 도움이 되는 기본 조인트 기능을 활용할 수 있습니다. 앞으로 유니티는 계속해서 워크플로를 간소화하고 빌트인 Physics 컴포넌트의 기능을 개선해 나갈 것입니다. 빌트인 Physics 저작 컴포넌트에서 스프링 및 감쇠 파라미터의 모터 지원 추가, Configurable Joint 저작 컴포넌트의 베이킹 지원 확대 등이 여기에 포함됩니다. 예정된 개선 사항은 움직이는 래그돌(ragdoll)처럼 둘 이상의 축으로 움직이는 조인트를 비롯해 움직임이 많은 조인트를 지원할 때 도움이 될 것입니다.

지원이 필요한 사용 사례가 있나요? 잘 이해할 수 없는 부분이 있나요? 아니면 건설적인 피드백을 제공하고 싶으신가요? 그렇다면 Unity Physics 포럼에서 토론에 참여하여 Unity Physics를 개선하는 데 도움을 주시기 바랍니다.

2023년 4월 11일 엔진 & 플랫폼 | 10 분 소요

Is this article helpful for you?

Thank you for your feedback!

관련 게시물