private void UpdateControllerState(int index)
        {
            m_NativeController.UpdateState(index);
            states[index].controllerType = m_NativeController.GetControllerType(index);
#if UNITY_EDITOR
            if (NRInput.EmulateVirtualDisplayInEditor)
            {
                states[index].controllerType = ControllerType.CONTROLLER_TYPE_PHONE;
            }
#endif
            states[index].availableFeature = (ControllerAvailableFeature)m_NativeController.GetAvailableFeatures(index);
            states[index].connectionState  = m_NativeController.GetConnectionState(index);
            states[index].rotation         = m_NativeController.GetPose(index).rotation;
            states[index].position         = m_NativeController.GetPose(index).position;
            states[index].gyro             = m_NativeController.GetGyro(index);
            states[index].accel            = m_NativeController.GetAccel(index);
            states[index].mag          = m_NativeController.GetMag(index);
            states[index].touchPos     = m_NativeController.GetTouch(index);
            states[index].isTouching   = m_NativeController.IsTouching(index);
            states[index].recentered   = false;
            states[index].isCharging   = m_NativeController.IsCharging(index);
            states[index].batteryLevel = m_NativeController.GetBatteryLevel(index);
            states[index].buttonsState = (ControllerButton)m_NativeController.GetButtonState(index);
            states[index].buttonsDown  = (ControllerButton)m_NativeController.GetButtonDown(index);
            states[index].buttonsUp    = (ControllerButton)m_NativeController.GetButtonUp(index);

            IControllerStateParser stateParser = ControllerStateParseUtility.GetControllerStateParser(states[index].controllerType, index);
            if (stateParser != null)
            {
                stateParser.ParserControllerState(states[index]);
            }
            CheckRecenter(index);
        }
        private void UpdateControllerState(int index)
        {
            m_NativeController.UpdateState(index);
            states[index].controllerType   = m_NativeController.GetControllerType(index);
            states[index].availableFeature = (ControllerAvailableFeature)m_NativeController.GetAvailableFeatures(index);
            states[index].connectionState  = m_NativeController.GetConnectionState(index);
            states[index].rotation         = m_NativeController.GetPose(index).rotation;
            states[index].position         = m_NativeController.GetPose(index).position;
            states[index].gyro             = m_NativeController.GetGyro(index);
            states[index].accel            = m_NativeController.GetAccel(index);
            states[index].mag          = m_NativeController.GetMag(index);
            states[index].touchPos     = m_NativeController.GetTouch(index);
            states[index].isTouching   = m_NativeController.IsTouching(index);
            states[index].recentered   = false;
            states[index].isCharging   = m_NativeController.IsCharging(index);
            states[index].batteryLevel = m_NativeController.GetBatteryLevel(index);
            states[index].buttonsState = (ControllerButton)m_NativeController.GetButtonState(index);
            states[index].buttonsDown  = (ControllerButton)m_NativeController.GetButtonDown(index);
            states[index].buttonsUp    = (ControllerButton)m_NativeController.GetButtonUp(index);

            IControllerStateParser stateParser = ControllerStateParseUtility.GetControllerStateParser(states[index].controllerType, index);

            if (stateParser != null)
            {
                stateParser.ParserControllerState(states[index]);
            }
            CheckRecenter(index);
        }
    private void UpdateControllerState(int index)
    {
        if (!Inited || _dataBytes == null)
        {
            return;
        }
        _isPhone = _dataBytes[26] > 0;
        try
        {
            r_x            = BitConverter.ToSingle(new byte[] { _dataBytes[4], _dataBytes[5], _dataBytes[6], _dataBytes[7] }, 0);
            r_y            = BitConverter.ToSingle(new byte[] { _dataBytes[8], _dataBytes[9], _dataBytes[10], _dataBytes[11] }, 0);
            r_z            = BitConverter.ToSingle(new byte[] { _dataBytes[12], _dataBytes[13], _dataBytes[14], _dataBytes[15] }, 0);
            r_w            = r_x * r_x + r_y * r_y + r_z * r_z;
            r_w            = (float)Math.Sqrt(1 - r_w);
            _rotation      = new Quaternion(r_x, r_y, r_z, r_w);
            device_touch_x = (short)(((_dataBytes[16] << 4) & 0x0FF0) | ((_dataBytes[17] >> 4) & 0x0F));
            device_touch_y = (short)((_dataBytes[17] & 0x0F) << 8 | _dataBytes[18] & 0xFF);

            if (device_touch_x == 0 && device_touch_y == 0)
            {
                _touch.x = 0f;
                _touch.y = 0f;
            }
            else
            {
                _touch_resolution_x = _isPhone ? 1000f : 3840f;
                _touch_resolution_y = _isPhone ? 1000f : 1080f;
                _touch.x            = (device_touch_x / _touch_resolution_x - 0.5f) * 2f;
                _touch.y            = -(device_touch_y / _touch_resolution_y - 0.5f) * 2f;
            }
            _physical_button = (_dataBytes[19] & 0x1) > 0;
        }
        catch (Exception)
        {
            Debug.LogError("Controller Data Error");
        }

        states[index].controllerType   = _isPhone ? ControllerType.CONTROLLER_TYPE_PHONE : ControllerType.CONTROLLER_TYPE_NREALLIGHT;
        states[index].availableFeature = ControllerAvailableFeature.CONTROLLER_AVAILABLE_FEATURE_ROTATION;
        states[index].connectionState  = ControllerConnectionState.CONTROLLER_CONNECTION_STATE_CONNECTED;
        states[index].rotation         = _rotation;
        states[index].touchPos         = _touch;
        states[index].isTouching       = false;
        states[index].recentered       = false;
        states[index].isCharging       = false;
        states[index].buttonsState     = _physical_button ? ControllerButton.TRIGGER : 0;
        states[index].buttonsDown      = 0;
        states[index].buttonsUp        = 0;

        IControllerStateParser stateParser = ControllerStateParseUtility.GetControllerStateParser(states[index].controllerType, index);

        if (stateParser != null)
        {
            stateParser.ParserControllerState(states[index]);
        }
        CheckRecenter(index);
    }