2016-06-05 11 views
0

Ive stieß auf ein Problem, dass ich nicht richtig meinen Kopf wickeln kann.Kamera Relative Bewegung

Ich mache eine Top-Down-Perspektive 3D-Spiel durch Unity. Ich habe einen Controller, mit dem sich mein Charakter drehen und bewegen kann, wenn er die Bewegungstasten drückt. Wenn Sie zum Beispiel "D" drücken, wird das Spielerobjekt nach rechts gedreht und dann wird der starre Körper in diese Richtung bewegt. Wenn ich jedoch die Kamera rotiere, bewegt sich der Spieler nicht relativ zur Kamerarichtung.

Die Bewegung:

//Player Movement 
    void HandleMove() 
    { 
     if (canMove == true) 
     { 
      //Detect input movement 
      var moveHorizontal = Input.GetAxis("Horizontal"); 
      var moveVertical = Input.GetAxis("Vertical"); 
      IsMoving = moveHorizontal != 0 || moveVertical != 0; 

      Vector3 relative = transform.rotation.eulerAngles; 
      relative.y = pCamera.playerRelativeAngle; 

      //Rotate the character 
      var movement = new Vector3(moveHorizontal, 0.0f, moveVertical); 
      var rot = movement * (speed/10); 

      if (attackTimer <= 0 && movement != Vector3.zero) 
      { 
       Vector3 temp = transform.rotation.eulerAngles; 
       var newRotation = Quaternion.LookRotation(rot); 
       transform.rotation = Quaternion.RotateTowards(transform.rotation, newRotation, 10F); 
      } 

      //Move the character 
      if (IsMoving && offset.y != 0f) 
      { 
       movement.y = offset.normalized.y * movement.magnitude; 
      } 

      var characterMovement = transform.position + movement; 
      if (attackTimer <= 0 || !IsGrounded) 
      { 
       rbody.MovePosition(characterMovement); 
      } 
    } 

Ich habe eine leichte Ahnung, was zu tun ist, aber ich kann es nicht vollständig erfassen, ich habe eine Kamera eingerichtet, dass kann seine Euler-Winkel und kehre ich versuchte herauszufinden, eine Möglichkeit, dies für die relative Bewegung zu verwenden, aber ich bin mir nicht sicher, wo oder wie ich es in meiner Bewegungssteuerung anwenden soll.

Die Kamera:

//Find camera angle 
public static float playerRelativeAngle; 

//On awake, do this 
void Awake() 
{ 
    //Get the cameras angle so we can move the player relative to it??? 
    playerRelativeAngle = this.transform.localEulerAngles.y; 
} 

//Update every frame 
void Update() 
{ 
    playerRelativeAngle = this.transform.localEulerAngles.y; 

    //If the right key is pressed then the caerma rotates to the right 
    if (Input.GetKey("right")) 
    { 
     this.transform.RotateAround(target.transform.position, Vector3.down, cameraSpeed * Time.deltaTime); 
    } 
    if (Input.GetKey("left")) 
    { 
     this.transform.RotateAround(target.transform.position, Vector3.down, -cameraSpeed * Time.deltaTime); 
    } 
} 

Jede Beratung sehr geschätzt wird.

Antwort

0

Ich habe die Lösung für mein Problem gefunden.

Die Bewegung:

   //Rotate the character relative to the camera direction 
      if (attackTimer <= 0 && moveDirection != Vector3.zero) 
      { 
       var targetDirection = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); 
       targetDirection = Camera.main.transform.TransformDirection(targetDirection); 
       targetDirection.y = 0.0f; 
       Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up); 
       float rotationSpeed = 100.0f; 
       Quaternion newRotation = Quaternion.Lerp(rbody.rotation, targetRotation, rotationSpeed * Time.deltaTime); 

       //Apply the rotation 
       rbody.MoveRotation(newRotation); 
      } 

      //Move the character 
      if (IsMoving == true) 
      { 

       if (Input.GetAxis("Vertical") != 0) //Vertical movement (Up/Down) 
       { 
        if (attackTimer <= 0 || !IsGrounded) 
        { 
         rbody.AddForce(transform.forward * speed); 
        } 
       } 

Der Spieler Objekt dreht sich nun in Bezug auf die Kamera und dann eine Kraft in die Spieler Vorwärtsrichtung, wenn eine Bewegungstaste gedrückt wird.

Es ist keine perfekte Lösung, aber hoffentlich kann dies in Zukunft jemand helfen.