如何检测Oculus触摸控制器的插入/拔出?

时间:2017-08-30 11:25:16

标签: c++ unreal-engine4 oculus

我再次编辑它,尽可能简单。我希望我的游戏能力(在虚幻引擎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.我正在调用函数AMyGameMode :: IsTouchConnected(); 然后它通过MotionController指针调用IMotionController :: IsControllerConnected。 3.然后由于OculusInput中的压力过大,Oculus函数被调用并返回我的主要目标。

现在出了什么问题:

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

1 个答案:

答案 0 :(得分:0)

所以我终于成功了,所以我想在这里发帖给所有搜索它的人。

首先,您要做的是添加到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;
}

使用此代码,我可以成功检查我的触控器(在这种情况下是左侧)是否已连接:)希望我可以帮助任何人使用它!