Player Setup
- XRI Network Player Avatar는 네트워크 환경에서 각 플레이어의 시각적 표현을 관리하며, XR 상호작용을 위한 필수 요소를 포함합니다.
- Player Name Tag와 Hands Networked를 통해 플레이어 식별 및 상호작용을 쉽게 처리할 수 있습니다.
- XR Avatar Visuals 스크립트를 통해 사용자 정의 시각적 효과를 적용할 수 있습니다.
주요 구성 요소 설명
Hierarchy 창
- XRI_Network_Player_Avatar
- 네트워크 플레이어를 나타내는 프리팹으로, XR 환경에서 각 플레이어의 시각적 표현을 담당합니다.
- Avatar_Head
- 플레이어의 머리를 나타냅니다.
- Canvas > Player Name Tag
- 플레이어의 이름 태그가 포함된 UI 요소입니다.
- Left Hand Networked와 Right Hand Networked
- 플레이어의 왼손과 오른손에 대한 트랜스폼 및 네트워크 정보를 포함합니다.
- Left Hand Collider, Right Hand Collider
- 손의 상호작용을 처리하는 충돌 컴포넌트입니다.
Inspector 창
Network Object:
- 네트워크 관련 설정으로, 오브젝트의 동기화와 관리 동작을 제어합니다.
- Synchronize Transform, Spawn With Observer 등이 활성화되어 있으며, 이는 네트워크 상태를 동기화하고 관찰자와 함께 스폰되도록 설정합니다.
XRI Network Player (Script)
플레이어의 XR 상호작용과 동작을 처리하는 스크립트.
- Avatar Transform References
- 플레이어 아바타의 주요 트랜스폼 요소(Head, Left Hand, Right Hand)를 연결합니다.
- Player Name Tag
- 이름 태그를 업데이트하거나 관리하는 데 사용됩니다.
- Networked Hands
- 네트워크로 동기화되는 손 오브젝트를 관리합니다.
XR Avatar Visuals (Script)
아바타의 시각적 표현을 처리하는 스크립트.
플레이어 옵션을 설정하는 방법
m_NetworkPlayer.onColorUpdated += SetPlayerColor;
- 이는 플레이어의 색상을 업데이트하거나 사용자 정의 동작을 추가할 수 있도록 이벤트를 구독합니다.
- Renderer References
- 머리와 관련된 스킨드 메쉬 렌더러가 연결됩니다.
- Host Visuals
- 호스트 플레이어에 대한 특별한 시각적 표현(예: Crown)을 표시합니다.
XR Avatar IK
플레이어의 머리와 상체 위치를 기반으로 자연스러운 아바타 동작을 구현합니다.
- 회전과 높이를 동적으로 조정하여 몰입감을 높입니다.
주요 기능 및 사용 목적
- 플레이어의 머리와 상체의 움직임을 동적으로 처리하여 몰입감을 높입니다.
- IK를 통해 사용자 동작과 XR 아바타의 움직임이 자연스럽게 매핑됩니다.
Head Transform:
플레이어의 머리 트랜스폼(Transform)을 참조합니다.
현재 Head (Transform)으로 설정되어 있습니다.
Torso Parent Transform:
상체의 부모 트랜스폼으로, 플레이어의 기초 위치를 제공합니다.
현재 Base (Transform)으로 설정되어 있습니다.
Head Visuals Root:
머리 시각 효과의 루트 트랜스폼을 참조합니다.
현재 Avatar_Head (Transform)으로 설정되어 있습니다.
Neck:
목의 트랜스폼을 지정하여 머리와 상체의 연결을 처리합니다.
현재 Neck (Transform)으로 설정되어 있습니다.
Head Height Offset:
머리 높이의 오프셋 값을 설정합니다(현재 0.3).
Rotate Threshold:
회전 임계값으로, 플레이어가 회전할 때 감지하는 각도(현재 25도).
Rotate Speed:
회전 속도를 설정합니다(현재 3).
XR Hand Pose Replicator IK
손가락 동작과 컨트롤러 입력을 네트워크를 통해 동기화합니다.
- 손가락 움직임의 정확도를 조정하여 성능과 디테일 사이의 균형을 맞출 수 있습니다.
- 손의 자세(포즈)를 복제하여 멀티플레이어 환경에서 일관된 상호작용을 제공합니다.
주요 기능 및 사용 목적
- 손의 위치와 자세를 네트워크를 통해 실시간으로 복제합니다.
- 컨트롤러와 손의 동작을 반영하여 멀티플레이어 환경에서 신뢰도 높은 상호작용을 제공합니다.
Fidelity Level과 Min Update Delta 설정은 성능에 영향을 줄 수 있으므로 사용 환경에 맞게 조정하세요.
Fidelity Level:
손가락 동작의 정확도를 설정합니다. 현재 슬라이더는 0으로 설정되어 있습니다.
Min Update Delta:
업데이트 간 최소 시간 간격(현재 0.1초).
Hand Curler:
손가락 움직임을 조정합니다.
Finger Lerp Speed: 손가락 움직임 속도(현재 20).
Update Hands Locally: 손 업데이트가 로컬에서만 수행될지를 결정합니다.
Controller Inputs:
Grip Input Properties: 그립(쥐는 동작)의 입력 민감도(현재 2).
Trigger Input Properties: 트리거 버튼 입력 민감도(현재 2).
Thumb Touch Properties: 엄지손가락 터치 입력 민감도(현재 2).
Offsets:
Hand Controller Offsets: 손 컨트롤러의 위치 오프셋(현재 2).
Hand Controller Elbow Offsets: 팔꿈치 위치 오프셋(현재 2).
Player Colocation
- 네트워크 환경에서 플레이어 아바타를 동기화하고 표시하는 데 사용됩니다.
Is Showing Avatar:
아바타 표시 여부를 결정합니다. 현재 활성화되어 있습니다.
Network Player:
네트워크 플레이어를 참조합니다. 현재 XR_Network_Player_Avatar로 설정되어 있습니다.
IK와 손동작 복제는 네트워크 상태와 사용자 입력의 정밀도에 따라 다르게 작동할 수 있습니다.
Player Name Tag
- 이름 태그는 플레이어 아바타 머리 위에 표시되며, 이름과 마이크 상태를 나타냅니다.
- 마이크 활성화 시 음성을 시각적으로 표현하는 Pulse Effect가 표시됩니다.
- 이름 태그에는 LOD 시스템이 포함되어 있어, 거리와 시선에 따라 시각적 혼잡을 줄이고 효율성을 높입니다.
주요 기능 및 사용 목적
- 플레이어 식별:
- 플레이어 이름과 이니셜을 표시하여 멀티플레이어 환경에서 참가자를 식별할 수 있습니다.
- 음성 상태 시각화:
- 마이크 활성화 상태와 음성 사용 여부를 쉽게 확인할 수 있도록 시각적 효과를 제공합니다.
- LOD 시스템:
- 다수의 플레이어가 있는 방에서 시각적 혼란을 방지하며, 성능을 최적화합니다.
- Callout Gaze Controller:
- 사용자가 이름 태그를 바라볼 때 관련 효과를 트리거하여 상호작용을 강화합니다.
Player Name Tag (Script)
플레이어 식별:
플레이어 이름과 이니셜을 시각적으로 표시하여 멀티플레이어 환경에서 참가자를 식별할 수 있습니다.
음성 상태 표시:
마이크 상태와 음성 활동을 시각적으로 보여주며, 음소거 여부를 쉽게 알 수 있습니다.
LOD 시스템:
거리 기반으로 이름 태그를 표시하거나 숨겨, 성능을 최적화하고 시각적 혼란을 방지합니다.
Voice Particles:
음성 활동을 입자 효과로 표현하여 생동감을 더합니다.
- World Up:
- 이름 태그가 항상 월드 업 벡터(일반적으로 위쪽 방향)로 정렬되도록 설정합니다.
- Name Tag Text:
- 플레이어 이름 텍스트를 표시하는 요소입니다.
- Initials Text: 플레이어 이니셜을 표시하는 텍스트 요소(Text Mesh Pro UGUI 사용).
- Colored Image: 이름 태그에 표시되는 프로필 이미지를 설정합니다.
- Name Text Scale:
- 이름 텍스트의 크기를 조정합니다. 현재 값은 0.25입니다.
Voice Chat
- Mute Button:
- 음소거 버튼을 설정합니다.
- Voice Chat Fill Image:
- 음성 활동을 나타내는 시각적 효과(예: 채우기 막대)입니다.
- Mic Icon:
- 마이크 상태를 나타내는 아이콘(예: 켜짐/꺼짐).
- Squelched Icon:
- 음소거 상태를 표시하는 아이콘.
- Muted Sprite:
- 마이크가 음소거되었을 때 표시되는 스프라이트(UI 아이콘).
- Unmuted Sprite:
- 마이크가 활성화되었을 때 표시되는 스프라이트(UI 아이콘).
- Connecting Anim Object:
- 연결 중 상태를 나타내는 애니메이션 오브젝트.
- Voice Particles:
- 음성 활동을 나타내는 입자 이펙트(Particle System)입니다.
- Element 0: 왼쪽 음성 입자 이펙트.
- Element 1: 오른쪽 음성 입자 이펙트.
Name Tag LOD Settings
- Max Distance Threshold:
- 이름 태그가 표시되는 최대 거리. 현재 값은 4.5입니다.
- Min Distance Threshold:
- 이름 태그가 표시되는 최소 거리. 현재 값은 0.5입니다.
- Game Object to Hide:
- 일정 거리 이상에서는 숨겨지는 오브젝트(예: Layout Group).
- Game Object Details to Deactivate:
- 특정 상황에서 비활성화될 오브젝트 목록입니다.
- Element 0: Name.
- Element 1: Mic Button.
사용 시 주의사항
LOD 설정과 Game Object to Hide는 멀티플레이어 환경에서 성능 최적화에 중요한 역할을 하므로 적절한 값으로 조정해야 합니다.
음성 관련 설정(Voice Particles, Mic Icon 등)은 네트워크 상태와 플레이어의 상호작용을 고려하여 테스트하세요.
Callout Gaze Controller (Script)
- 시선 추적을 기반으로 오브젝트와 상호작용을 관리.
- 사용자가 오브젝트를 바라볼 때와 시선을 뗄 때 각각 트리거 이벤트를 실행합니다.
- 거리 및 시선 방향에 따라 UI 또는 오브젝트를 동적으로 활성화하거나 비활성화합니다.
- Gaze Transform:
- 사용자의 시선을 추적하는 데 사용되는 트랜스폼(Transform)입니다.
- 현재 설정되지 않았으며, 시선 추적 대상이 지정되지 않은 상태입니다.
적절한 트랜스폼을 설정하지 않으면 시선 추적이 작동하지 않으니, 사용자(예: 카메라)의 위치 또는 시선 방향 트랜스폼을 지정해야 합니다.
- Facing Threshold:
- 시선이 오브젝트를 바라보고 있다고 감지하기 위한 임계값. 현재 0.95로 설정되어 있습니다.
- 값이 높을수록 정확한 시선 추적이 요구됩니다.
- Facing Entered ():
- 사용자가 오브젝트를 바라보기 시작했을 때 실행되는 이벤트.
- PlayerNameTag.ToggleFocused 메서드를 호출하여 특정 행동(예: 강조 표시)을 트리거합니다.
- Facing Exited ():
- 사용자가 오브젝트를 바라보는 것을 멈췄을 때 실행되는 이벤트.
- 동일하게 PlayerNameTag.ToggleFocused 메서드를 호출합니다.
- Large Movement Distance Threshold:
- 큰 움직임을 감지하기 위한 거리 임계값. 현재 0.05로 설정.
- Large Movement Cool Down:
- 큰 움직임이 감지된 후 재활성화까지의 대기 시간. 현재 0.25초로 설정.
- Use Distance Threshold:
- 거리 기반으로 시선을 추적할지 여부. 활성화된 상태.
- Max Distance Threshold:
- 시선 추적이 가능한 최대 거리. 현재 10으로 설정되어 있습니다.
Facing Threshold와 Max Distance Threshold는 성능과 사용자 경험 간의 균형을 고려하여 설정해야 합니다.
Event Trigger
- UI와의 포인터 기반 상호작용(예: 마우스 또는 컨트롤러) 이벤트를 처리.
- 사용자가 UI를 강조하거나 포커스를 잃을 때 이벤트를 실행합니다.
UI 요소가 예상치 못한 이벤트를 트리거하지 않도록 적절히 필터링해야 합니다.
- Pointer Enter:
- 사용자가 UI 요소에 포인터(예: 마우스)를 올렸을 때 실행되는 이벤트.
- PlayerNameTag.ToggleFocused 메서드를 호출합니다.
- Pointer Exit:
- 사용자가 UI 요소에서 포인터를 제거했을 때 실행되는 이벤트.
- CalloutGazeController.CheckPointerExit 메서드를 호출하여 포인터 상태를 확인합니다.