2017-08-30 3 views
1

Je l'édite encore, pour le rendre aussi simple que possible. Je veux avoir la capacité dans mon jeu (fait dans le moteur irréel 4) pour détecter si les contrôleurs tactiles d'Oculus sont branchés ou pas. Ci-dessous vous pouvez trouver ce que j'ai fait jusqu'à présent.Comment puis-je détecter le branchement/le retrait des contrôleurs tactiles Oculus?

tout d'abord ce que je faisais jusqu'à présent: En 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; 
    } 

J'ai ajouté ceci dans IMotionController.h:

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

Enfin, dans MyGameMode J'ai ajouté ceci:

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

TSharedPtr<IMotionController> MotionController; 

et cpp

bool AMyGameMode::IsTouchConnected(int32 ControllerIndex) 
{ 

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

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

Voici comment cela devrait fonctionner: 1.J'appelle la fonction AMyGameMode :: IsTouchConnected(); 2. Ensuite, il appelle IMotionController :: IsControllerConnected via le pointeur MotionController. 3. Puisqu'il est surpassé dans OculusInput, la fonction Oculus est appelée et renvoie ma cible principale.

Quel est le problème maintenant:

pointeur MotionController semble être nullptr toujours. Je n'ai aucune idée de comment le faire fonctionner.

+0

S'il vous plaît [modifier] votre question pour afficher [le code que vous avez jusqu'à présent] (http://whathaveyoutried.com). Vous devez inclure au moins un aperçu (mais de préférence un [mcve]) du code avec lequel vous rencontrez des problèmes, puis nous pouvons essayer d'aider avec le problème spécifique. Vous devriez aussi lire [ask]. –

+0

Je fais des commentaires parce que j'ai fait des progrès dans ce problème je pense :) –

+0

Je pense que vous avez mal interprété les mots ** minimal ** et ** complet ** que j'ai écrit. –

Répondre

0

Donc, j'ai finalement fait, donc je voulais l'afficher ici pour tous ceux qui cherchent.

tout d'abord ce que vous voulez faire est d'ajouter à IMotionController nouvelle fonction:

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

Ensuite, vous allez à OculusInput et ajoutez ceci:

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

Enfin, dans votre classe vous ajoutez ceci:

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

Avec ce code, je peux vérifier avec succès si mon contrôleur tactile (de gauche dans ce cas) est connecté ou non :) J'espère pouvoir aider n'importe qui avec!