2017-09-09 3 views
0

Cela a été un problème depuis une semaine maintenant. Je n'arrive pas à comprendre. J'essaie de retourner mon sous-marin sur son axe y une fois qu'il est à l'envers. il tourne sur la position de ma souris.Erreur d'erreur de # c ne peut pas retourner mon sous-marin sur son axe des y

Ce code fait pivoter mon sous-marin sur la position de la souris, ce qui est parfait.

Vector3 RayPos = cam.WorldToScreenPoint(transform.position); 
Vector3 dir = Input.mousePosition - RayPos; 
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; 
Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward); 
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 
rotateSpeed * Time.deltaTime);[sub flipping y][1] 

Maintenant, ce code est mon problème. Une fois que mon sub va à l'envers, il retourne (y) mais il le fait seulement une fois et puis quand je reviens dans la bonne direction il ne retournera plus sur (y) plus.

Debug.Log(Mathf.Abs(Vector3.Dot(transform.up, Vector3.up))); 
if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.down)) < 0.125f) 
{ 
    if (Mathf.Abs(Vector3.Dot(transform.right, Vector3.down)) > 0.825f) 
    { 
     SubTrans.localScale = new Vector3(transform.localScale.x, -1, 
     transform.localScale.z); 
    } 
    else 
    { 
     SubTrans.localScale = new Vector3(transform.localScale.x, 1, 
     transform.localScale.z); 
    } 
} 
+1

C'est la deuxième fois que vous posez cette question. Vous n'obtenez pas de réponses parce qu'il est difficile de comprendre votre problème. Peut-être que vous devriez montrer le gif animé de ce à quoi ressemble le problème. – Programmer

Répondre

0
if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.down)) < 0.125f) 

Je suppose que cela rend votre code effectuer l'échange que lorsque le sous est d'environ 90 degrés au sol. C'est bien parce que la valeur absolue signifie qu'il se produit sur les deux côtés gauches &.

if (Mathf.Abs(Vector3.Dot(transform.right, Vector3.down)) > 0.825f) 

Cependant cela est faux en raison de la valeur absolue. Il traite & de la même façon (comparativement puisque vous utilisez transform.right), ce qui signifie qu'il vous retourne toujours parce que abs (transform.right) est toujours> 0.8 lorsque la condition précédente est valide.

Vous devriez vérifier si le sous pointe vers le haut ou vers le bas en vérifiant la direction comme ça

if (Mathf.Abs(Vector3.Dot(transform.up, Vector3.up)) > 0f) //less than 90deg angle with up 
//flip sub upwards 
else 
//flip downwards 

Vous pouvez garder l'extérieur si elle est conditionnelle si vous le souhaitez retourner à certains moments, mais cela est tout ce qui est nécessaire.