【问题标题】:How Can i detect plugging in/out Oculus touch controllers?如何检测插入/拔出 Oculus 触摸控制器?
【发布时间】:2018-02-08 02:13:11
【问题描述】:

我正在再次对其进行编辑,以使其尽可能简单。我想在我的游戏中(在虚幻引擎 4 中制作)能够检测是否插入了 Oculus 触摸控制器。您可以在下面找到我到目前为止所做的事情。

首先我到目前为止做了什么: 在 Oculus Input.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.我正在调用函数 AMyGameMode::IsTouchConnected(); 2.然后通过 MotionController 指针调用 IMotionController::IsControllerConnected。 3.然后由于在OculusInput中被覆盖,Oculus Function被调用并返回我的主要目标。

现在出了什么问题:

MotionController 指针似乎始终为 nullptr。我不知道如何使它工作。

【问题讨论】:

  • edit您的问题显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask
  • 我发表评论是因为我认为我在这个问题上取得了一些进展:)
  • 我认为您误读了我写的 minimalcomplete 这两个词。

标签: c++ unreal-engine4 oculus


【解决方案1】:

所以我终于成功了,所以我想在这里发布它以供任何搜索它的人使用。

首先你要做的是给 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;
}

最后在你的课堂上你要添加这个:

.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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多