마우스 움직임
플레이어의 마우스 움직임에 실시간으로 반응하여 드래그 제스처를 구현하고, 오브젝트를 회전시키고, 커스텀 카메라를 조작하세요.
당신의 씬은 매 프레임 플레이어의 원시 마우스 이동을 읽고, 이를 사용해 실시간 상호작용을 구현할 수 있습니다: 드래그 및 스와이프 제스처, 플레이어가 끄는 동안 오브젝트를 회전시키거나 미끄러지게 하는 것, 또는 1인칭 슈팅 게임처럼 사용자 정의 카메라를 조작하는 것.
이를 위해 다음을 읽으세요 screenDelta 의 속성 PrimaryPointerInfo 다음에 있는 컴포넌트 engine.RootEntity. 이 속성은 Vector2 로, 마지막 프레임 이후 마우스가 몇 픽셀 이동했는지 보고합니다. 양수 x 값은 마우스가 오른쪽으로 이동했음을 의미하고, 양수 y 값은 아래로 이동했음을 의미하며, 화면의 원점이 왼쪽 위 모서리에 있는 것과 일치합니다 — 다음과 같은 동일한 좌표 공간입니다: UiTransform 및 UiCanvasInformation. 마우스가 움직이지 않는 프레임에서는 두 값이 모두 0입니다.
import { engine, PrimaryPointerInfo } from '@dcl/sdk/ecs'
engine.addSystem(() => {
const delta = PrimaryPointerInfo.getOrNull(engine.RootEntity)?.screenDelta
if (!delta) return
console.log(`마우스 이동: ${delta.x}, ${delta.y}`)
})왜냐하면 screenDelta 단일 프레임의 이동만 담고 있으므로, 항상 다음 안에서 읽으세요: 시스템, 프레임 사이의 이동이 놓치지 않도록.
📔 참고: 다음을 참조하지 마세요 engine.RootEntity 초기 씬 로딩 시에는 엔티티가 아직 초기화되지 않았다면 오류가 발생할 수 있습니다. 이 문제를 피하려면 항상 시스템 안에서 엔티티를 참조하세요. 시스템의 첫 실행은 씬이 이미 제대로 초기화된 뒤에 호출되므로, 엔티티는 항상 사용할 수 있습니다.
커서가 잠겨 있을 때의 마우스 이동
screenDelta 다음의 다른 속성과는 다르게 동작합니다 PrimaryPointerInfo 커서가 잠겨 있을 때: screenCoordinates 화면 중앙에 고정되고 worldRayDirection 항상 화면 중앙의 레이를 반환하지만, screenDelta 커서가 잠겨 있어도 매 프레임 원시 마우스 이동을 계속 보고합니다. 따라서 커서가 잠겨 있는 동안 마우스 이동을 읽는 유일한 방법이며, 이는 사용자 정의 카메라나 조준 컨트롤에 정확히 필요한 것입니다.
오브젝트를 드래그해 회전시키기
다음 예제에서는 포인터 버튼을 누른 채 마우스를 좌우로 드래그하면 플레이어가 큐브를 회전시킬 수 있습니다:
같은 패턴은 모든 드래그 상호작용에 적용할 수 있습니다: 레일을 따라 엔티티를 이동시키는 데 delta.x 를 오프셋으로 사용하거나, 애니메이션을 스크러빙하거나, 큰 delta 값으로 빠른 스와이프를 감지할 수 있습니다.
마우스룩 카메라 컨트롤
왜냐하면 screenDelta 커서가 잠겨 있어도 계속 작동하므로, 다음을 위한 마우스룩 컨트롤을 만들 수 있습니다: 가상 카메라. 이를 위해 마우스 이동을 yaw와 pitch 각도로 누적한 다음, 매 프레임 카메라의 회전에 적용하세요.
다음 예제에서는 플레이어가 상자를 클릭해 마우스로 조작할 수 있는 가상 카메라로 전환하고, 보조 버튼(F 또는 마우스 오른쪽 버튼)을 눌러 기본 카메라로 돌아갑니다. 가상 카메라가 활성화되어 있는 동안 씬은 커서도 잠그고, 아바타를 다음으로 고정합니다: 입력 수정자, 따라서 플레이어가 카메라를 조작하는 동안 무작정 돌아다니지 않게 됩니다.
이 예제에서 알아둘 점:
시스템은 다음을 더합니다:
delta.y를 pitch에 더합니다. 마우스를 위로 움직이면 음수delta.y, 즉 pitch가 낮아지고 카메라가 위로 기울어집니다. 세로 조작을 반전하고 싶다면 부호를 뒤집으세요.pitch는 -85도에서 85도 범위로 제한되므로, 카메라가 뒤로 완전히 뒤집힐 수 없습니다.
이
SENSITIVITY상수는 마우스 이동 픽셀당 회전 각도를 나타내므로, 원하는 대로 조정하세요.
관련 주제
커서의 이동이 아니라 화면상의 절대 위치를 읽으려면 다음을 사용하세요: screenCoordinates 같은 컴포넌트의 속성입니다. 다음을 참조하세요: 플레이어의 커서 위치 확인하기.
커서 아래에 어떤 엔티티가 있는지 알아보려면 다음을 결합하세요: worldRayDirection 속성을 레이캐스트와 함께 사용하세요. 다음을 참조하세요: 레이캐스팅.
마지막 업데이트