This document is about: FUSION 1
SWITCH TO

VR 방 탈출

Level 4
Available in the Gaming Circle and Industries Circle
Circle
Fusion VR 방 탈출 샘플은 Photon Gaming Circle 또는 Photon Industries Circle에 가입한 사용자만 사용할 수 있습니다.

Gaming Circle 멤버십은 빠른 시간에 멀티플레이어 게임을 생성하고 런칭하기 위한 모든 샘플, SDK 및 지원이 포함되어 있습니다. 비게임의 경우, 당사의 Industries Circle은 전체 제품군 및 독점 라이센스 옵션을 제공합니다.

개요

방 탈출 샘플은 플레이어와 환경 간의 물리 상호 작용 개발 방식에 대해서 설명합니다. Core는 기본 상호 작용 및 이동을 제공하는 반면 옵션 모듈은 샘플 구현으로 추가 기능과 상호 작용 유형을 제공합니다. 모든 모듈에는 자체 폴더가 있으며 필요하지 않은 경우 제거할 수 있습니다. 이 샘플에 제공된 메인 씬(/Scenes/EscapeRoom Full.scene)은 모든 모듈과 컴포넌트를 사용하며 모듈을 삭제할 때 파손될 수 있습니다. 모듈은 이 문서의 끝에 별도로 설명되어 있습니다.

모듈:

  • 물건 끌어오기
  • 인스턴트 카메라
  • 화이트보드
  • 옵저버
  • Ui 모듈
  • 슬롯 모듈
  • 슈팅 모듈
fusion escape room overview

기술 정보

  • 이 샘플은 Server/Hosted Mode 토폴로지를 사용합니다.
  • 프로젝트는 유니티 2020.3.31f1로 개발되었습니다.

시작하기 전에

샘플 실행 :

  • PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 App Id Fusion Real Time 설정 (Fusion 메뉴에서 접근)에서 App Id Fusion 에 붙여 넣습니다.

  • PhotonEngine 관리 화면에서 Voice AppId를 생성하고 Real Time 설정에서 App Id Voice필드에 붙여 넣습니다

  • 그러고 나서 Start 씬을 로드하고 Play를 누릅니다. 그런 다음 전체 씬을 시작하거나 특정 모듈만 테스트할 수 있습니다.

Fusion Expo 샘플은 Photon Gaming Circle 또는 Photon Industries Circle에 가입한 사용자만 사용할 수 있습니다. 상세 내용 및 접근에 대해서는 developer@photonengine.com으로 이메일로 문의해 주세요.

다운로드

버전 릴리즈 일자 다운로드
1.1.3 Oct 20, 2022 Fusion VR Escape Room 1.1.3 Build 5

입력 처리

메타 퀘스트

  • 텔레포트 : 포인터 표시는 A 또는 X 버튼을 누릅니다. 떼었을 때 허용된 장소로 텔레포트합니다.
  • 터치 : 간단히 버튼에 손/손가락을 대어 토글 합니다.
  • 잡기 : 먼저 물체 위에 손을 얹고 컨트롤러 잡기 버튼을 사용하여 잡습니다.
  • 사용 : 잡은 물체를 사용하려면 선택 버튼을 누릅니다.

HTC Vive 컨트롤로와 Valve Index 컨트롤러는 지원되어야 합니다.

데스크톱

키보드

  • 걷기 : WASD
  • 위/아래 : 스페이스 및 왼쪽 시프트

마우스

  • 회전 : 마우스 오른쪽 버튼을 누른 상태로 마우스를 이동하여 시점을 회전합니다.
  • UI : 왼쪽 버튼을 사용하여 UI 버튼을 누릅니다.
  • 잡기 & 사용 (3D 펜) : 마우스를 물체 위에 놓고 왼쪽 마우스 버튼을 사용하여 잡습니다. 그런 다음 키보드 스페이스 키로 사용할 수 있습니다.

핵심

샘플의 핵심은 RigidbodiesArticulation bodies와의 물리 기반 상호 작용을 제공합니다. Rigidbody는 던질 수 있는 모든 물체에 사용되는 반면 Articulation Bodies는 지렛대, 다이얼, 문, 서랍과 같은 기계 시스템에 사용됩니다. 카메라는 물리학을 기반으로 하는 것이 아니라 사용자 입력만을 기반으로 합니다. 텔레포트 이동 기능이 포함되어 있습니다(TeleportHandler.cs).

상호작용 흐름 개요:

  • 입력 폴링 및 전송 :
    • (XRInput.cs, LocalController.cs, PCInput.cs)
  • 리기드바디 및 힘을 이용한 입력 기반으로 머리와 손 위치 갱신 :
    • (PlayerSystem.cs, XRObject.cs)
  • 손은 입력을 읽어 HandTool과 IControllerInputReceiver에 전달 :
    • (Hand.cs, IControllerInputReceiver)
  • 입력에 반응하기 위한 HandTool 및 기타 컴포넌트 :
    • (HandTool.cs, TeleportHandler.cs, InstantCameraInteractable.cs)
  • HandTool은 핫스팟이 범위 내에 있는지 확인하고 입력에 따라잡고/놓습니다 :
    • (HotspotCollector.cs, Hotspot.cs, HighlightBase.cs)
  • 핫스팟은 상호 작용을 시작/정지할 때 InteractableBase 및 모든 IInteractable을 알려줍니다 :
    • (InteractableBase.cs, GrabbableBase.cs)
  • GrabbableBase는 힘을 이용하여 손 위치를 추적합니다 :
    • (GrabbableBase.cs, GrabbableRigidbody.cs, GrabbableArticulation.cs)

입력:

입력 전송

LocalInputBase.cs

Fusion과 독립적으로 DontDestroyOnLoad 객체로 존재하며 세션 간에 지속됩니다. 입력을 수집하여 Runner에게 보내는 역할을 합니다.

  • XRInput은 이의 주요 구현입니다.
  • PCInput은 더 빠른 반복을 위한 디버그 입력 메소드이지만 기능이 제한되어 있습니다.

입력 수신

PlayerSystem.cs

XRObject.cs를 통해서 플레이어 객체(머리와 손)의 기본 위치를 처리합니다. XRObject는 입력 추적을 위해 리기드바디 힘을 업데이트합니다.

Hand.cs

컨트롤러 입력을 읽고 IControllerInputReceiver를 통해 입력을 수신하도록 등록된 모든 것에 전달합니다. 기본 상호 작용을 위해 입력을 명시적으로 HandTool.cs에 전달합니다.

  • 입력을 수신하려는 시스템은 IControllerInputReceiver를 구현하고 손에 등록할 수 있습니다(예: TeleportHandler.cs).
  • 붙잡힌 물체는 임시로 등록할 수 있습니다(예: InstantCameraInteractable.cs) -> Hand.AddInputBehaviour() / Hand.RemoveInputBehaviour())

상호작용

HandTool:

  • 쥐고/놓기용 입력 읽기
  • Hotspots을 찾고 강조 위해 HotspotCollector를 사용
  • Hotspots 쥐고 / 놓기

HotspotCollector:

  • 레이어 및 태그 기반으로 반경 내 Hotspots을 찾기
  • 필터 순서: 레이어, 태그, HighlightPriority, 거리
  • 마우스가 위에 올라가 있는 핫스팟 강조 표시(HotspotCollector -> Hotspot -> HighlightBase)

핫스팟:

HandTools가 물체와 상호 작용할 수 있는 상호 작용 지점을 나타냅니다.

  • 핫스팟당 한 개의 손, 더 많은 손으로 물체를 잡아야 할 경우 핫스팟을 더 추가합니다. 필요한 경우 이러한 핫스팟은 동일할 수 있습니다.
  • 시작/중지 상호 작용 호출을 동일한 GameObject의 IInteractable과 상위의 InteractableBase에 전달합니다.

InteractableBase:

상호 작용 가능한 물체용 기본 클래스.

  • 상호 작용 호출의 시작과 중지
잡을 수 있는 물체의 객체 계측 구조:
  • 루트: InteractableBase, Rigidbody, NetworkRigidbody, Highlight, NetworkObject, BodyProperties
    • 비주얼
      • 하이라이트 비주얼
    • 충돌
    • 핫스팟: Hotspot, GrabbableRigidbody / AttachmentRigidbody, Collider (트리거)

BodyProperties

BodyPropertyCollection(스크립트 가능 객체)을 할당하여 물체를 잡을 때의 동작을 제어

BodyPropertyCollection

한 번에 물체를 잡는 손의 수에 따라 잡힌 물체에 적용되는 BodyPropertyData배열이 들어있습니다(0: 잡은 것 없음, 1: 한 손으로 잡음, n: n개의 손으로 잡음). 이렇게 하면 한 손으로 잡기엔 물체가 크거나 무거울 수 있지만 두 개 이상의 손으로 잡으면 물체를 다루기가 쉽습니다.

  • BodyPropertyData:
    • Mass
    • Drag
    • AngularDrag
    • JointFrictionArticulation (Articulation bodies에만 적용)
    • UseGravity
    • OverrideInertia (설정된 경우 관성이 InertiaWhenGrabbedScale * Vector3.one로 설정)
    • InertiaWhenGrabbedScale (물체가 회전 변화에 얼마나 저항하는지 제어)
    • VelocityExtrapolation (물체에 새로운 힘을 가할 때 현재 속도가 얼마나 상쇄되는지, 힘 자체에 대한 승수로도 사용)
    • TorqueExtrapolation (물체에 새로운 힘을 가할 때 현재 각속도가 얼마나 상쇄되는지)

GrabbableBase (핫스팟에서):

잡았을 때 물체를 손 위치 추적 처리

바디 유형에 따라 적절한 구현 선택:

  • GrabbableRigidbody
  • GrabbableArticulation

AttachmentRigidbody (Hotspot GameObject에서):

Rigidbody를 HandTool에 부착합니다. 이것은 매우 날렵해야 하는 가벼운 물체에 사용됩니다. (예: 화이트보드 마커, InstantCamera 사진, 권총) 이 작업이 수행되려면 객체는 다음과 같은 구조가 필요합니다:

  • 루트
    • 비주얼
    • 충돌/로직
      • 콜라이더
      • 핫스팟: AttachmentRigidbody, 트리거 콜라이더,

CollisionVisuals GameObjects에 직접 붙어 마치 손의 일부인 것처럼 동작합니다.

하이라이트

손의 범위 내에 있고 상호 작용할 수 있다는 시각적 확인

값 제공자 / 리더

값 제공자는 한 시스템에서 다른 시스템으로 정보를 전송하고 전문화된 컴포넌트 없이 간단한 논리 체인을 만드는 일반적인 컴포넌트입니다.

예제:

  1. 관전 바디에서 값을 읽습니다 (ArticulationBodyValueReaderFloat.cs)
  2. 한계치와 비교합니다 (ValueLogicIntCompare.cs)
  3. 이 값을 사용하여 다른 것을 진행합니다. (ArticulationBodyDriverSetLimits.cs)

StreamTextureManager

모듈에 필요합니다. OnReliableData 콜백을 사용하여 네트워크를 통해 텍스처 데이터를 전송하는 시스템입니다. Runner로서 동일한 GameObject에 있어야 합니다.

IgnoreCollision

때때로 Physics.IgnoreCollision API를 사용하여 특정 물체 간의 충돌을 무시할 필요가 있습니다.

  • IgnoreCollision.cs: 정적 무시. 게임 플레이 중에 변경되지 않습니다. 스크립트가 있는 GameObject의 콜라이더는 목록에 있는 모든 콜라이더를 무시합니다.
  • NetworkColliderCollection.cs: 무시할 수 있는 콜라이더들의 그룹
  • NetworkIgnoreCollision.cs: AddIgnore()RemoveIgnore()를 사용하여 할당된 모든 NetworkColliderCollections에 대해 로컬 콜라이더를 무시합니다.

관절 바디

이 샘플은 관절 바디를 많이 사용합니다. 유니티에서 연결된 바디를 안정적으로 시뮬레이션할 수 있는 방법으로 레버, 버튼, 다이얼 및 드로어 등에 사용됩니다. 이 샘플에서의 NetworkArticulationBody의 구현은 완전한 기능의 구현이 아닙니다. https://docs.unity3d.com/2020.3/Documentation/ScriptReference/ArticulationBody.html를 참고하세요.

핵심 컴포넌트

  • NetworkArticulationBodyRootRoot에 놓여집니다.
  • NetworkArticulationBody는 모든 자식 관절 바디에 놓여집니다.
    • NetworkedArticulationDrive 관절 바디의 드라이브 속성을 네트워크로 연결합니다.
    • ArticulationBodyValueReaderSingleAxis는 값 공급자 시스템에서 사용할 관절 바디의 값을 읽을 수 있습니다.
    • ArticulationBodySingleAxisSoftSnap은 특정 지점에 스냅하도록 드라이브 속성을 동적으로 설정합니다. 예: 다이얼의 노치, 서랍의 소프트 클로즈, 레버의 유효한 위치 고정.

로컬 보간

NetworkArticulationBodyNetworkTransform을 상속받아 안정적인 로컬 보간을 제공합니다. 의도한 대로 작동하기 위해서는 보간 대상을 설정하고 관절 바디의 계층구조를 반영해야 합니다.

구조

  • 루트: NetworkObject, ArticulationBody, NetworkArticulationBodyRoot, InteractableBase
    • 비주얼: Articulation system과 동일한 계층구조.
    • 차일드: ArticulationBody, NetworkArticulationBody, (선택: BodyProperties* ArticulationBodySoftSnap, ArticulationBodyValueReaderSingleAxis)
      • 차일드: (선택, 위와 동일한 컴포넌트))
        • 핫스팟: 핫스팟, 트리거 콜라이더, GrabbableArticulation

Hotspot 아위에 BodyProperties 컴포넌트가 한 번 이상 필요합니다. 각각의 핫스팟은 부모에게서 첫 번째 것을 찾을 것입니다.

리기드 바디에 관절 바디 연결

Articulation리기드바디에 붙여질 필요가 있다면, Joint (eg a ConfigurableJoint)를 사용해야 합니다.(예 ConfigurableJoint).

알려진 문제

  • 관절 바디Compute Parent Anchor을 사용하지 마세요: 초기 상태가 아닐 때 클라이언트마다 다릅니다.
  • 관절 바디의 버그는 관절 계층에 대해 서로 다른 인덱스를 생성합니다. 적절하게 동기화하려면 클라이언트 간에 동일한 기능이 필요합니다. 임시 수정 프로그램이 NetworkArticulationBodyRoot.Spawned()에 구현되었습니다. 이렇게 하면 올바른 순서로 재 정렬됩니다.
    • 이 "핫픽스"는 아쉽게도 리기드바디관절 바디 사이의 구성 가능한 모든 조인트를 분리합니다(예: 슈팅 모듈의 피스톨). 따라서 이 개체에 대해 재정렬을 사용할 수 없습니다.

모듈

물건 끌어오기

물체를 가리기ㅗ 잡기 버튼을 누른 상태에서 손을 위로 움직여 물체를 끌어당깁니다.

필요 사항:

  • HandToolObjectPullCollector 프리팹
  • HotspotObjectPullBody 컴포넌트 , 또한 GrabbableBase 컴포넌트 (GrabbableRigidbody) 필요

인스턴트 카메라

인스턴트 카메라는 보다 복잡한 상호 작용 가능한 객체(추가 입력)를 보여주고 네트워크를 통해 더 큰 데이터를 전송하기 위한 OnReliableData 콜백.

  • InstantCameraInteractable: 카메라 렌더 텍스처를 캡처하여 사진을 찍습니다. 해당 텍스처에 대한 인쇄물을 스폰.
  • InstantCameraPrintout: 셰이더를 사용하여 텍스처가 페이드 될 때까지 기다립니다. 또한 사진을 처음 찍은 후 참여한 클라이언트에게 다시 전송합니다
  • InstantCameraPicture.shader: 사진을 받은 후 페이드인 할 단순 표면 셰이더입니다.

화이트보드

화이트보드 위에 그릴 수 있습니다.

  • WhiteboardSurface: 위에 그릴 표면. 현재 상태는 Rendertexture로 저장됩니다.
  • WhiteboardMarker: 상호작용 가능. 표면(경계)을 검토하고 가까울 때 스트로크를 그리도록 지시합니다.

셰이더

  • WhiteboardFill: 주어진 텍스처로 화이트보드 초기화
  • WhiteboardStroke: 렌더텍스처 위에 직선 그리기
  • WhiteboardStrokeEraser: 렌더텍스처의 직선 지우기

관찰자

VR 플레이어 관찰 및 세계와 상호 작용을 위한 마우스/키보드.

필요 사항:

  • 관찰자는 다른 입력 장치 및 플레이어 프리팹을 사용합니다. (StartModulebutton.cs 참고)
  • 조작하고 싶은 물체에 IObserverable 컴포넌트 추가
    • 리기드바디를 끌기 위한 ObserverableGrabRigidbody
    • ObservableArticulationBodyButton 고정 힘 추가(토글 될 수 있음)
    • ObservableArticulationBodyDrawer 지속 시간 동안 힘을 추가하고 부울 상태를 유지 (다시 누를 때 힘을 뒤집음)
    • ObservableArticulationBodyLever 쥐고 있을 때 힘 추가
    • ObservableValueProviderOverride 직접 부동 소수점 값 설정 (토글 오버라이드 하여). 효과를 내기 위해서 로직 체인에 주입되어야 합니다.

플로팅 UI 윈도우는 CreateObserverUi()를 사용하여 모든 IObserverable 컴포넌트에 대해서 자동적으로 생성됩니다. 사용자 지정 UI는 여기에서 구현할 수 있습니다. 기본 컴포넌트들은 UI_ObserverItem 프리팹에 정의되어 있습니다.

관찰자 입력

관찰 가능한 물체의 조작은 입력으로 직접 전송됩니다. (ObserverInput / ObserverInputHandler.cs 참고) 입력 구성 요소 :

  • 변경된 컴포넌트 식별을 위한 NetworkBehaviourId
  • (현재는 float, bool 빛 Vector3)

UI 모듈

기본 네트워크 커서 및 UI 상호 작용. 유니티의 '추적된 장치 레이캐스터'와 '입력 시스템 UI 입력 모듈을 사용하여 캔버스 상호 작용을 로컬로 등록하고 입력으로 전송합니다. PC Rig와 함께 사용하려면 '그래픽 레이캐스터'도 있어야 합니다.

  • LocalController.OnInputUi()

    • InputDataController.CanvasBehaviour (NetworkBehaviourId)로 가리키려는 캔버스를 저장합니다
    • 캔버스와 충돌하는 포인터의 월드 위치를 InputDataController.CursorPosition에 저장합니다.
    • 포인터가 NetworkedUiButton 컴포넌트와 히트하면, InputDataController.UiInteractionBehaviour (NetworkBehaviourId)에 저장합니다.
  • UiPointerHandler

    • 입력을 읽어 포인터 위치를 전송하고 상응하는 NetworkedCanvasNetworkedUiButton과 상호작용합니다.

슬롯 모듈

슬롯 시스템은 물체를 미리 정해진 위치/방향으로 부드럽게 안내하는 데 사용됩니다. 고려: 플러그, 키, 퍼즐 조각, 탄창 등. 이를 위해 GrabbableBase.cs에는 다양한 델리케이트와 콜백이 있어 물체를 잡는 동안 도달하고자 하는 목표 위치를 오버라이드 합니다.

  • RotationDelegate GetRotationMethod
  • GrabAndTargetPositionDelegate GetGrabAndTargetPositionMethod
  • UnityAction PreTrackCallback
  • UnityAction PostTrackCallback

Slottable

Slottable 컴포넌트는 이러한 콜백들을 오버라이드하고 Slot과 관련하여 현재 원하는 위치 및 회전을 변경합니다.

  • PreTrack: 슬롯이 영향을 받게 되는 곳에 가까운지 확인하고 나중에 사용하기 위해서 2개의 요인을 계산합니다,

    • _slotFactorHand: 손에서 슬롯까지의 거리입니다. 이것은 물체가 가정해야 할 대상 위치와 회전을 결정하는 데 사용됩니다.
    • _slotFactorObject: 물체에서 슬롯까지의 거리입니다. 이 명령은 개체가 슬롯에 있고 놓아야 하는지 여부와 개체를 계속 회전할 수 있는지 여부를 확인하는 데 사용됩니다(>RotationLockThreshold) .
  • PostTrack: 물체가 떨어져야 하는지 확인.

물체 팩터는 물체의 실제 위치인 반면, 손 팩터는 힘이 적용되기 전에 손의 입력 위치에서 결정됩니다.

Slottable_slotFactorHand_slotFactorObject에 따라 Slot에서 원하는 위치/회전을 가져옵니다.

추가 컴포넌트:

  • GrabbableRidgidbody
  • HotspotCollector: 유효한 슬롯 찾기
  • (선택) NetworkColliderCollection: 슬롯 근처에 있을 때 무시되는 콜라이더를 지정합니다(설정되어 있는 경우 슬롯에 설정된 콜라이더와 핫스팟과 상호 작용하는 손에는 무시됨).

슬롯

Slot 컴포넌트에는 범위 내에 있을 때 물체가 어떻게 동작해야 하는지에 대한 데이터가 들어 있습니다. Curves은 물체 위치에서 위치/회전이 원하는 슬롯 위치로 얼마나 갑자기 변경되는지를 결정합니다. Slottables HotspotCollector에서 올바른 레이어를 사용하여 트리거로 표시된 충돌기를 하나 이상 선택해야 합니다.

HotspotsToIgnoreHandCollisionWhenGrabbed는 핫스팟을 움켜쥔 손을 무시하는 데 사용할 수 있습니다. 공간이 좁아서 Slot을 움켜쥔 손을 무시하고 싶을 때 유용합니다. 예: 한 손은 권총을 들고 있고, 탄창과 슬롯이 손에 매우 가까워서 정상적인 상황에서는 탄창이 손에 충돌합니다. 핸들의 핫스팟을 여기에 추가하면 손 충돌도 무시할 수 있습니다. UseLineForRange는 포인트 대신 선 세그먼트를 슬롯할 수 있는 대상으로 사용하도록 설정할 수 있습니다.

DropType은 성공적으로 슬롯이 설정되었을 때 물체가 처리되는 방식을 결정합니다.

  • Kinematic: 정적 레벨 지오메트리에 슬롯 되는 물체에 사용됩니다. 물체는 운동학적으로 바뀌어 다시 잡지 않으면 움직일 수 없습니다.
  • Destroy: 물체 스폰 해제
  • (TeleportOffsite: 제대로 테스트되지 않았으며, 단단한 바디에 슬롯을 장착한 물체에 사용할 수 있으므로 다시 잡을 때 즉시 위치를 변경할 수 있습니다. 슬롯 가능한 곳의 위치에 렌더링 하려면 수신 측에서 약간의 매직이 필요합니다.)

Slots은 다양한 파라미터를 확인하여 Slottable을 슬롯화할 수 있는지 여부를 결정합니다.

  • SlotType이 슬롯과 일치합니다.
  • 다른 Slottable이 없습니다(또는 AllowMultipleObjects가 설정된 경우).
  • (Slot.CanSlot())에 더 많은 제약 사항을 추가할 수 있습니다.

컴포넌트:

  • NetworkIgnoreCollision (선택): 슬롯 객체에 대해 할당된 콜라이더를 무시할 수 있습니다. 이 기능을 사용하면 Slottable이 벽을 통과할 수 있지만 손이나 슬롯에 맞지 않는 다른 물체는 벽을 통과할 수 없습니다.

슈팅 모듈

총과 같은 상호 작용을 하는 방법의 샘플 구현입니다. 두 가지 예가 제공됩니다.

  • 샷건

    • 한 번데 여러 개의 총알
    • GrabbableRigidbody를 사용한 무거운 물리 바디
    • 단일 쉘 리로딩
  • 권총

    • 관절 바디를 사용한 수동 발사
    • 탄창 완전 재로딩
    • AttachmentRigidbody를 사용한 잡기

알아두면 좋은 것

씬 설정

Connector.csLocalRigSpawner.cs은 모든 씬에서 볼 수 있습니다. 씬에서 로컬 리그가 스폰 되지 않거나 씬에서 미리 정의되지 않으면 하나의 리그(xr 또는 pc)가 생성되고 러너가 생성되어 연결됩니다. Start.scene경우 러너는 SinglePlayer 모드로 시작합니다. 이렇게 하면 추가 작업 없이 게임 코드에 완전히 접근할 수 있습니다.

손과 물체 시각적 보간 :

다른 상황에서 NetworkRigidobdy의 정기적인 보간은 Render()에서 오버라이트됩니다.

  • 손이 물체를 잡지 않았거나 충돌하지 않는 경우 로컬 컨트롤러 위치가 설정됩니다. 이렇게 하면 손 물체를 힘을 가하여(XRObject.cs, UpdateRender()) 이동할 때 발생하는 지연을 방지할 수 있습니다.
  • 손이 물체를 잡고 있는 경우, 물체는 시각적 손 위치에 대한 사실상의 권한으로 이동합니다. 손은 상호 작용이 시작될 때의 초기 오프셋(GrabbableBase.cs Render())을 고려하여 잡은 물체에 대해 상대적으로 배치됩니다.
  • 물체가 놓으면 시각적 손은 실제 위치로 다시 이동됩니다(HandTool.cs Render())

일반적인 문제

  • 잡을 수 있는 물체가 사방으로 날아다니고 / 이상하게 회전: 힘이 쌓이거나 진동하지 않는지 확인하려면 다음 설정을 확인하십시오. 플레이하는 동안 편집기에서 조정할 수 있습니다.

  • BodyProperties : 각 잡을 수 있는 물체는 물리 특성이 설정되고 동기화되는 BodyProperties 컴포넌트를 가지고 있습니다. 속성 자체는 스크립팅 가능한 객체이며 유사한 객체 간에 재사용할 수 있습니다. 값을 조정하여 물체가 가질 수 있는 무게와 느낌을 얻습니다. 물체가 제어 불능 상태가 되면 위치 또는 회전 컴포넌트가 진동할 수 있습니다. GrabbableBase 컴포넌트 내에서 위치 및/또는 회전을 추적하여 문제의 원인을 파악하고 그에 따라 조정할 수 있습니다.

    • 위치: 질량, 드래그, UseGravityk, 속도 외삽법
    • 회전: 질량, 각도 드래그, Interia, 토크 외삽법
  • GrabbableRidgidbody, "잡는 위치를 질량 중심으로 설정" : Grabbable Rigidbody 컴포넌트에서 잡을 때 질량 중심을 잡는 위치로 설정하면 전환됩니다. 이는 물체의 회전 특성에 큰 영향을 미치며 다른 BodyProperties이 필요할 수 있습니다. 동일한 BodyProperties을 가진 유사한 객체의 동작이 다를 경우 이것이 원인일 수 있습니다.

Back to top