我如何检测堵塞 in/out Oculus 触摸控制器?

How Can i detect plugging in/out Oculus touch controllers?

我正在重新编辑它,以使其尽可能简单。我想在我的游戏(unreal engine 4 中制作)中检测是否插入了 Oculus 触摸控制器。您可以在下面找到我到目前为止所做的事情。

首先我到目前为止做了什么: 在OculusInput.cpp

  bool FOculusInput::IsControllerConnected(int32 ControllerIndex) const
    {
        for (const FOculusTouchControllerPair& ControllerPair : ControllerPairs)
        {
            if (ControllerPair.UnrealControllerIndex == ControllerIndex)
            {
                const FOculusTouchControllerState& ControllerState = ControllerPair.ControllerStates[(int32)EControllerHand::Left];

                if (ControllerState.bIsConnected)
                {
                    return true;
                }
                return false;
            }
            return false;
        }
        return false;
    }

然后我在 IMotionController.h 中添加了这个:

virtual bool IsControllerConnected(int32 ControllerIndex)const
    {
        return false;
    }

最后在 MyGameMode 中我添加了这个:

UFUNCTION(BlueprintCallable, Category = "Controller")
    bool IsTouchConnected(int32 ControllerIndex);

TSharedPtr<IMotionController> MotionController;

并在 .cpp 中

bool AMyGameMode::IsTouchConnected(int32 ControllerIndex)
{

    if (!MotionController.IsValid())
    {
    MotionController.Get(); //this doesn't work
    }

    if (MotionController.IsValid())
    {
        return MotionController->IsControllerConnected(ControllerIndex);
    }
    return false;
}

它应该是这样工作的: 1.I正在调用函数AMyGameMode::IsTouchConnected(); 2.Then 它通过 MotionController 指针调用 IMotionController::IsControllerConnected。 3.Then 由于在 OculusInput 中被覆盖,Oculus 函数被调用并且 returns 我的主要目标。

现在有什么问题:

MotionController 指针似乎总是 nullptr。我不知道如何让它工作。

所以我终于做到了,所以我想 post 在这里供任何搜索它的人使用。

首先你要做的是添加到 IMotionController 新功能:

virtual bool IsControllerConnected(int32 ControllerIndex)const
    {
        return false;
    }

然后你去 OculusInput 添加这个:

.h

virtual bool IsControllerConnected(int32 ControllerIndex)const override;

.cpp

bool FOculusInput::IsControllerConnected(int32 ControllerIndex) const
{
    for (const FOculusTouchControllerPair& ControllerPair : ControllerPairs)
    {
        if (ControllerPair.UnrealControllerIndex == ControllerIndex)
        {
            const FOculusTouchControllerState& ControllerState = ControllerPair.ControllerStates[(int32)EControllerHand::Left];

            if (ControllerState.bIsConnected)
            {
                return true;
            }
            return false;
        }
        return false;
    }
    return false;
}

最后在您的 class 中添加:

.h

#include "MotionControllerComponent.h"


UFUNCTION(BlueprintCallable, Category = "Controller")
    bool IsTouchConnected(int32 ControllerIndex);


TSharedPtr<class UMotionControllerComponent> MCComponent;

.cpp

bool YourClass::IsTouchConnected(int32 ControllerIndex)
{
    TArray<IMotionController*> controllers = IModularFeatures::Get().GetModularFeatureImplementations<IMotionController>(IMotionController::GetModularFeatureName());

    for (IMotionController* MotionController : controllers)
    {
        return MotionController->IsControllerConnected(ControllerIndex);
    }
    return false;
}

使用此代码,我可以成功检查我的触摸控制器(在本例中为左侧)是否已连接 :) 希望我可以帮助任何人!