LogoLogo
WebsiteBlogForumsSign up
  • Welcome
  • How Ready Player Me works
  • FAQ
  • 👩‍💻Integration Guides
    • Overview
    • Unity
      • Quickstart
      • Avatar Creator Integration
        • WebView Avatar Creator
          • Avatar Creator for Android & iOS
          • Avatar Creator for WebGL
        • Build your own Avatar Creator
          • Start with the sample
          • Elements
            • Asset Selection Element
            • Color Selection Element
            • Template Selection Element
            • Body Shapes Selection Element
            • Gender Selection Element
            • Avatar List Element
            • Photo Capture Element
            • Signup Element
            • Login Element
            • Logout Element
          • User Management
      • Load 2D Renders
      • Avatar Loader Window
      • Setup Multiplayer
      • Setup for XR (Beta)
        • Setup the Player Avatar
        • Setup Meta Movement SDK
        • Setup Final IK
        • Setup XR Hands
          • RpmHandDriver script
        • Facial Animations
        • VR Avatar Creator
      • Animations
        • Ready Player Me Animation Library
        • Mixamo Animations
      • Optimize
        • Avatar Configuration
        • Avatar Caching
        • Defer Agents
      • Code Samples
        • Loading 3D Avatars
        • Loading 2D Avatars
        • Avatar Creator (WebGL)
        • Avatar Creator (Desktop)
        • Avatar Creator (Mobile)
        • Distance-based LODs
      • Troubleshooting
        • Editor UI Window Issues
        • Avatar loading issues
        • iOS issues
        • WebGL issues
        • Firewall issues
        • Updating the SDK
          • Unity SDK 3.0.0 Migration guide
          • Unity SDK 4.0.0 Migration guide
          • Unity SDK 5.0.0
          • Unity SDK 7.0.0
          • WebView 2.0 Migration
        • Package installation issues
      • Help us improve the Unity SDK
      • FAQ for Unity
      • Early Access Features
    • Unreal Engine
      • Quickstart
        • Import SDK Manually
      • Avatar Creator Integration
        • Build your own Avatar Creator
          • Sample Structure
          • Customization Guide
        • WebView Avatar Creator
      • Load Avatars
      • Animations
        • Ready Player Me Animation Library
        • Loading Mixamo animations
        • Mannequin animation retargeting
        • Blender FBX export to UE
        • Oculus Lipsync integration
      • Optimize
        • Avatar configuration
        • Avatar caching
        • Avatar preloading
      • Code Samples
        • Unreal Engine 5 samples
        • Lyra project integration example
        • VR Avatars
        • Unreal Engine 4
      • Troubleshooting
        • Project compilation issues
        • Missing materials on built applications
        • Avatar loading issues
        • Animation issues
        • Unreal SDK breaking changes
        • Avatar lighting issues
        • Updating from earlier versions
          • Unreal SDK 3.0.0 Migration guide
        • Auto LOD issues
      • Help us improve the Unreal Engine SDK
      • FAQ for Unreal Engine
      • Early Access Features
    • React
      • Quickstart
    • React Native
    • iOS Native
    • Android Native
    • Web Integration
      • Quickstart
      • User Management
        • Guest Accounts
        • Account Linking
      • Avatar Creator integration
      • Optimize
    • API Integration
      • Quickstart
      • Custom Avatar Creator
      • User management
        • Ready Player Me Account
        • Anonymous Accounts
    • UX/UI Guidelines
      • Summary & quick tips
      • UX and UI guidelines and essentials
        • Foundation for good user experience
          • Layout
          • Colors
          • Typography
          • Icons
          • Dark mode and light mode
        • Mobile best practices
          • Layout
        • Making Ready Player Me feel native
          • Seamless Avatar Integration
          • Consistent Branding
          • Responsive Layout
          • Performance Optimization
        • Discoverability of the avatar editor
          • Onboarding tutorial
          • Clear navigation
          • Contextual Placement
  • 🖌️Customizing Guides
    • Studio (Developer Dashboard)
    • Avatar Creator Appearance
      • Avatar URLs
      • Avatar Shortcodes
    • Upload and Manage Custom Assets
      • Asset Manager in Studio
      • Configure in Studio
      • Manage custom assets using the API
      • Unlocking assets through API (Beta)
    • Create Custom Assets
      • Fullbody Outfits
        • Checking Skin Weights
      • Tops, Bottoms, Shoes
        • Editing templates
      • Hairstyle
      • Headwear
      • Facewear
      • Glasses
      • Hero Characters
      • Modeling Guidelines
  • 🔃API Reference
    • REST API
      • Authentication
      • Avatars
        • GET - 3D avatar
        • GET - 2D Render of an Avatar
        • GET - Metadata
        • PUT - Equip an asset
        • PUT - Unequip an asset
      • Assets
        • Asset Entity Properties
        • POST - Create Asset
        • GET - List Assets
        • PATCH - Update Asset
        • POST - Upload Asset Files
        • POST - Add Asset to Application
        • DELETE - Remove Asset from Application
        • PUT - Unlock asset for a user
        • PUT - Lock asset for a user
      • Users
        • POST - Create User
      • Auth
        • GET - Token
      • Changelog
    • Avatars
      • Full-body avatars
      • Full-body XR avatars
      • Half-body avatars
      • Morph targets
        • Apple ARKit
        • Oculus OVR LipSync
    • Avatar Creator
  • 🔉Support
    • Forums
    • Licensing & Privacy
Powered by GitBook
On this page

Was this helpful?

  1. Integration Guides
  2. Unity
  3. Setup for XR (Beta)
  4. Setup XR Hands

RpmHandDriver script

public class RpmHandDriver : XRHandSkeletonDriver
    {
        [SerializeField] private Transform handBone;
        
        private static readonly Dictionary<XRHandJointID, string> JOINT_ID_BONE_PATH_MAP_LEFT = new()
        {
            { XRHandJointID.Palm, "LeftPalm" },
            { XRHandJointID.ThumbMetacarpal, "LeftHandThumb1" },
            { XRHandJointID.ThumbProximal, "LeftHandThumb1/LeftHandThumb2" },
            { XRHandJointID.ThumbDistal, "LeftHandThumb1/LeftHandThumb2/LeftHandThumb3" },
            { XRHandJointID.ThumbTip, "LeftHandThumb1/LeftHandThumb2/LeftHandThumb3/LeftHandThumb4" },
            { XRHandJointID.IndexMetacarpal, "LeftHandIndex0" },
            { XRHandJointID.IndexProximal, "LeftHandIndex0/LeftHandIndex1" },
            { XRHandJointID.IndexIntermediate, "LeftHandIndex0/LeftHandIndex1/LeftHandIndex2" },
            { XRHandJointID.IndexDistal, "LeftHandIndex0/LeftHandIndex1/LeftHandIndex2/LeftHandIndex3" },
            { XRHandJointID.IndexTip, "LeftHandIndex0/LeftHandIndex1/LeftHandIndex2/LeftHandIndex3/LeftHandIndex4" },
            { XRHandJointID.MiddleMetacarpal, "LeftHandMiddle0" },
            { XRHandJointID.MiddleProximal, "LeftHandMiddle0/LeftHandMiddle1" },
            { XRHandJointID.MiddleIntermediate, "LeftHandMiddle0/LeftHandMiddle1/LeftHandMiddle2" },
            { XRHandJointID.MiddleDistal, "LeftHandMiddle0/LeftHandMiddle1/LeftHandMiddle2/LeftHandMiddle3" },
            {
                XRHandJointID.MiddleTip,
                "LeftHandMiddle0/LeftHandMiddle1/LeftHandMiddle2/LeftHandMiddle3/LeftHandMiddle4"
            },
            { XRHandJointID.RingMetacarpal, "LeftHandRing0" },
            { XRHandJointID.RingProximal, "LeftHandRing0/LeftHandRing1" },
            { XRHandJointID.RingIntermediate, "LeftHandRing0/LeftHandRing1/LeftHandRing2" },
            { XRHandJointID.RingDistal, "LeftHandRing0/LeftHandRing1/LeftHandRing2/LeftHandRing3" },
            { XRHandJointID.RingTip, "LeftHandRing0/LeftHandRing1/LeftHandRing2/LeftHandRing3/LeftHandRing4" },
            { XRHandJointID.LittleMetacarpal, "LeftHandPinky0" },
            { XRHandJointID.LittleProximal, "LeftHandPinky0/LeftHandPinky1" },
            { XRHandJointID.LittleIntermediate, "LeftHandPinky0/LeftHandPinky1/LeftHandPinky2" },
            { XRHandJointID.LittleDistal, "LeftHandPinky0/LeftHandPinky1/LeftHandPinky2/LeftHandPinky3" },
            { XRHandJointID.LittleTip, "LeftHandPinky0/LeftHandPinky1/LeftHandPinky2/LeftHandPinky3/LeftHandPinky4" }
        };

        private static readonly Dictionary<XRHandJointID, string> JOINT_ID_BONE_PATH_MAP_RIGHT = new()
        {
            { XRHandJointID.Palm, "RightPalm" },
            { XRHandJointID.ThumbMetacarpal, "RightHandThumb1" },
            { XRHandJointID.ThumbProximal, "RightHandThumb1/RightHandThumb2" },
            { XRHandJointID.ThumbDistal, "RightHandThumb1/RightHandThumb2/RightHandThumb3" },
            { XRHandJointID.ThumbTip, "RightHandThumb1/RightHandThumb2/RightHandThumb3/RightHandThumb4" },
            { XRHandJointID.IndexMetacarpal, "RightHandIndex0" },
            { XRHandJointID.IndexProximal, "RightHandIndex0/RightHandIndex1" },
            { XRHandJointID.IndexIntermediate, "RightHandIndex0/RightHandIndex1/RightHandIndex2" },
            { XRHandJointID.IndexDistal, "RightHandIndex0/RightHandIndex1/RightHandIndex2/RightHandIndex3" },
            {
                XRHandJointID.IndexTip,
                "RightHandIndex0/RightHandIndex1/RightHandIndex2/RightHandIndex3/RightHandIndex4"
            },
            { XRHandJointID.MiddleMetacarpal, "RightHandMiddle0" },
            { XRHandJointID.MiddleProximal, "RightHandMiddle0/RightHandMiddle1" },
            { XRHandJointID.MiddleIntermediate, "RightHandMiddle0/RightHandMiddle1/RightHandMiddle2" },
            { XRHandJointID.MiddleDistal, "RightHandMiddle0/RightHandMiddle1/RightHandMiddle2/RightHandMiddle3" },
            {
                XRHandJointID.MiddleTip,
                "RightHandMiddle0/RightHandMiddle1/RightHandMiddle2/RightHandMiddle3/RightHandMiddle4"
            },
            { XRHandJointID.RingMetacarpal, "RightHandRing0" },
            { XRHandJointID.RingProximal, "RightHandRing0/RightHandRing1" },
            { XRHandJointID.RingIntermediate, "RightHandRing0/RightHandRing1/RightHandRing2" },
            { XRHandJointID.RingDistal, "RightHandRing0/RightHandRing1/RightHandRing2/RightHandRing3" },
            { XRHandJointID.RingTip, "RightHandRing0/RightHandRing1/RightHandRing2/RightHandRing3/RightHandRing4" },
            { XRHandJointID.LittleMetacarpal, "RightHandPinky0" },
            { XRHandJointID.LittleProximal, "RightHandPinky0/RightHandPinky1" },
            { XRHandJointID.LittleIntermediate, "RightHandPinky0/RightHandPinky1/RightHandPinky2" },
            { XRHandJointID.LittleDistal, "RightHandPinky0/RightHandPinky1/RightHandPinky2/RightHandPinky3" },
            {
                XRHandJointID.LittleTip,
                "RightHandPinky0/RightHandPinky1/RightHandPinky2/RightHandPinky3/RightHandPinky4"
            }
        };

        [ContextMenu("Set Bone References")]
        public void SetBoneReferences()
        {
            if (handBone == null)
            {
                Debug.LogError("Hand bone is not assigned.");
                return;
            }

            var handMap = handBone.name.Contains("LeftHand")
                ? JOINT_ID_BONE_PATH_MAP_LEFT
                : JOINT_ID_BONE_PATH_MAP_RIGHT;
            m_JointTransformReferences = new List<JointToTransformReference>();
            
            foreach (var kvp in handMap)
            {
                var joint = handBone.Find(kvp.Value);
                if (joint == null)
                {
                    Debug.LogWarning($"Joint transform not found: {kvp.Value}");
                    continue;
                }

                var jointRef = new JointToTransformReference
                {
                    xrHandJointID = kvp.Key,
                    jointTransform = joint
                };

                m_JointTransformReferences.Add(jointRef);
            }
        }
    }
PreviousSetup XR HandsNextFacial Animations

Last updated 1 year ago

Was this helpful?

👩‍💻