Search code examples
unity-game-enginevirtual-reality

Distance moved by XR-controller in Unity


I have been making a script in Unity that measures how far a player has moved in the real world using XRNodes like this for example with the right hand: InputTracking.GetLocalPosition(XRNode.RightHand) at the start of the movement and then comparing it to the end position Now I would like to get the distance moved, even if the player moved around in a circle. Is the a method to do this with XRNodes? Measuring total distance moved during play?


Solution

  • Yes, well, you could just simply sum it up every frame like

    // Stores the overall moved distance
    private float totalMovedDistance;
    
    // flag to start and stop tracking
    // Could also use a Coroutine if that fits you better
    private bool track;
    
    // Store position of last frame
    private Vector3 lastPos;
    
    public void BeginTrack()
    {
        // reset total value
        totalMovedDistance = 0;
        
        // store first position
        lastPos = InputTracking.GetLocalPosition(XRNode.RightHand);
    
        // start tracking
        track = true;
    }
    
    public void EndTrack()
    {
        // stop tracking
        track = false;
    
        // whatever you want to do with the total distance now
        Debug.Log($"Total moved distance in local space: {totalMovedDistance}", this);
    }
    
    private void Update()
    {
        // If not tracking do nothing
        if(!track) return;
    
        // get current controller position
        var currentPos = InputTracking.GetLocalPosition(XRNode.RightHand);
    
        // Get distance moved since last frame
        var thisFrameDistance = Vector3.Distance(currentPos, lastPos);
    
        // sum it up to the total value
        totalMovedDistance += thisFrameDistance;
    
        // update the last position
        lastPos = currentPos;
    }