2017-02-16 2 views
3

J'essaye de rendre possible de faire glisser un objet. Cet objet peut seulement tourner autant. (Similair à une porte).unité Tourner entre min et max distance

Voici le code abit édité qui fait tourner un objet qui fonctionne. J'ai 2 vecteurs pour maxrotation et minrotation.

Ce code sera appelé chaque fois que l'utilisateur fait glisser l'objet interactible. (Comme la mise à jour mais seulement lorsqu'ils sont traînés)

 if (GestureManager.Instance.IsNavigating && 
    HandsManager.Instance.FocusedGameObject == gameObject) 
     { 
      //speed and navigiation of rotation 
      float rotationFactor; 
      rotationFactor = ManipulationManager.Instance.ManipulationPosition.y * RotationSensitivity; 
      totransform.Rotate(new Vector3(rotationFactor, 0, 0)); 
     } 

Ce serait génial si je pouvais utiliser une instruction if ici. Et j'ai essayé pas mal de choses mais ça ne marche toujours pas.

Comme indiqué la pâte de code fonctionne ici. L'objet devrait être dragable mais seulement jusqu'à un certain point.

totransform est la transformation qui pivotent

Toutes les idées seraient grandes et les plus appréciés.

Cordialement.

+0

Hmm, qu'avez-vous essayé? Vous pouvez faire un 'Debug.Log (rotationFactor);' avant le totransform.Rotate et copiez les valeurs sur vos positions max et min souhaitées, puis faites un 'if (withinThatRange) {Rotate}'. Devrait marcher! Ou plutôt, vérifiez la rotation en premier. – Maakep

+0

btw le "totransform" n'est pas une faute de frappe, non? – Maakep

+0

ah désolé je n'ai pas élaboré je vais le changer. totransform est la transformée de l'objet qui sera transformé. –

Répondre

2

Je pense que vous voulez regarder eulerAngles. Vérifiez les valeurs que vous obtenez, puis définissez une if-statement avant de faire la rotation. Ceci est un exemple de code pour vous de trouver les valeurs que vous voulez:

if (GestureManager.Instance.IsNavigating && 
    HandsManager.Instance.FocusedGameObject == gameObject) 
{ 
    //speed and navigiation of rotation 
    float rotationFactor = ManipulationManager.Instance.ManipulationPosition.y * RotationSensitivity; 

    Debug.Log(totransform.eulerAngles); 
    if (totransform.eulerAngles.x < 100) { 
     totransform.Rotate(new Vector3(rotationFactor, 0, 0)); 
    } 
} 
+0

Disons dans ce cas la rotation minimale de x = -90 et le maximum 0. lors du débogage, je vérifie la valeur de X dans eulerangle qui est transformé en un nombre comme 3. Alors que la rotation x d'origine est -80. mais seulement après l'exécution de l'application, il change à 3 lors de l'appel eulerangle –

+0

Ah, à droite ... -1 dans l'inspecteur est de 359 degrés. Pour les nombres positifs, cela a plus de sens: http://imgur.com/a/l1qfC hehe. – Maakep

+0

Eh bien, les eulers vous obtenez l'angle correct, mais ce ne sera pas le même nombre que dans l'inspecteur. Par exemple, -90 degrés dans le sens inverse des aiguilles d'une montre est de 270 degrés dans le sens des aiguilles d'une montre, ce qui est ce que vous obtenez des eulerangles. Utilisez transform.localEulerAngles. – Maakep

0

Alors voici la solution qui a fonctionné pour moi. Je déclare d'abord la variable de mouvement (non vue ci-dessous, qui est 2 dans ce cas). Ensuite, je surveille la distance parcourue et je mets une limite à cela.

Bien sûr, il y a quelques améliorations à ce code, comme le mouvement d'utilisation au lieu de 2. Mais en raison des contraintes de temps, je ne l'ai pas fait.

if (GestureManager.Instance.IsNavigating && 
    HandsManager.Instance.FocusedGameObject == gameObject) 
     { 

       //here we get the movement direction and set it in movement. 
       if (GestureManager.Instance.NavigationPosition.y > 0) 
       { 
        movement = 2; 
       } 
       else if (GestureManager.Instance.NavigationPosition.y < 0) 
       { 
        movement = -2; 
       } 


      //the first part is false if we reach higher then maxdistance and the movement is going up 
      //the second part is false if we reach the lower distance and the movement is going down. 
      if ((!(distance > maxdistance.x) || movement < 0) && ((!(distance < mindistance.x) || movement > 0))) 
       { 
        //here we add the movement to the distance so we know if it gets closer or further 
        distance += movement; 
        //here we rotate 
        totransform.Rotate(new Vector3(movement, 0, 0)); 
       } 
     }