2017-02-20 5 views
0

Für ein 3D-First-Person-Controller-Spiel, konvertiere ich einen Swipe auf dem Bildschirm in einem Richtungsvektor. Ein Objekt wird in diese Richtung geschossen. Meine Kamera kann basierend auf der Eingabe eines virtuellen Joysticks drehen. Wenn ich nicht rotiere und das Objekt mit dem Swipe schieße, geht es in die richtige Richtung. Allerdings, wenn ich die Kamera rotiere geht es nicht in die beabsichtigte Richtung. Die Richtung sollte an die Drehung der Kamera angepasst werden.Wie korrigiere ich die Richtung meines Vektors zur Drehung der Kamera?

Wie korrigiere ich die Richtung meines Vektors zur Drehung der Kamera?

PS: Mitteilung ich für eine weitere Klarstellung

//Converting swipe direction to 3D direction 
public class TouchPair 
{ 
    public Vector2 startPos; 
    public int fingerId; 
} 

private TouchPair touchPair; 

void Update() 
{ 
    foreach (Touch touch in Input.touches) 
    { 
     Vector2 touchPos = touch.position; 

     if (touch.phase == TouchPhase.Began) 
     { 
     Ray ray = cam.ScreenPointToRay(touchPos); 
     RaycastHit hit; 

     if (Physics.Raycast(ray, out hit)) 
     { 
      //The player is wielding a bomb that is visible on the screen. 
      //only swipes that start from this object should count 
      if (hit.transform.tag == "Bomb") 
      { 
       touchPair = new TouchPair(); 
       touchPair.startPos = touchPos; 
       touchPair.fingerId = touch.fingerId; 
      } 
      } 
     } 
     else if (touch.phase == TouchPhase.Ended) 
     {   
     if (touchPair.fingerId == touch.fingerId) 
     { 
      Vector2 endPos = touchPos; 
      Vector2 swipeDirectionRaw = endPos - touchPair.startPos; 
      float magnitude = swipeDirectionRaw.magnitude; 
      if (magnitude >= minSwipeLength) 
      { 
        BombController BombController =               GameObject.FindWithTag("Bomb").GetComponent<BombController>(); 
          BombController.Throw(swipeDirectionRaw.normalized, magnitude); 
      } 
     } 
     } 
    } 
}  

public void Throw(Vector2 direction, float magnitude) 
{ 

    //Setup variables for throw 
    throwDirection = new Vector3(direction.x, 0.0f, direction.y); 
    throwSpeed = magnitude * throwForce; 
}    
+0

"Ich konvertiere einen Swipe auf dem Bildschirm in einem Richtungsvektor." - Können Sie uns den Code zeigen, der das macht? Ich nehme an, dass Sie kein Problem hätten, wenn Sie ['Camera.ScreenToWorldPoint'] (https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html) verwenden würden. – Quantic

Antwort

0

Ich musste den Ansichtsvektor der Kamera bekommen. Indem die Anzahl der Winkel zwischen dem Vorwärtsblickenden des Spielers und dem Ansichtsvektor der Kamera genommen wird, wird die Anzahl an Winkeln empfangen, die benötigt werden, um einen korrekten Richtungsvektor zu erhalten. Drehen Sie schließlich die Aufnahmerichtung um diese Anzahl an Winkeln.

    Vector2 endPos = touchPos; 
        Vector2 swipeDirectionRaw = endPos - touchPair.startPos; 
        float magnitude = swipeDirectionRaw.magnitude; 
        swipeDirectionRaw.Normalize(); 
        if (magnitude >= minSwipeLength) 
        { 
         GameObject player = GameObject.FindWithTag("Player"); 
         Vector3 shootOrigin = player.transform.position; 
         Vector3 uncorrectedShootDirection = new Vector3(swipeDirectionRaw.x, 0.0f, swipeDirectionRaw.y); 

         Vector3 originVector = player.transform.forward; 
         Vector3 viewVector = cam.transform.forward; 

         //Shoot direction gets corrected by angle between origin- and view vector 
         float angleBetweenOriginAndView = Vector3.Angle(originVector, viewVector); 

       //There is no clockwise or counter-clockwise in 3d space, 
       //hence mirroring is needed. In my case it's done to what suits my needs 
          if (viewVector.x < 0.0f) 
          { 
           angleBetweenOriginAndView *= -1f; 
          } 

         Vector3 correctedShootDirection = Quaternion.Euler(0, angleBetweenOriginAndView, 0) * uncorrectedShootDirection; 
        } 

        touchPair = null; 
       } 
0

Sie müssen Raycast mit Boden, wenn touch.phase == TouchPhase.Ended dann Richtung von Ihrem Charakter erhalten raycast.hit.

Raycasthit hitInfo; 
Physic.Raycast; 
Verwandte Themen