Jump to content
Unity Insider Forum

Kamerarelative Third Person Steuerung


Bowserkoopa

Recommended Posts

Wer Super Mario 64 schon mal gespielt hat weiß, dass sich der gute alte Klempner immer relativ zur Kamerarichtung bewegt. Das heißt, drücke "Rechts", bewegt sich Mario von mir aus gesehen nach Rechts. Bewege ich die Kamera nun um XX° und drücke wieder "Rechts", weiß er wie durch Zauberhand wieder in welches "Rechts" er sich bewegen muss. Das Skript basiert auf dem CharacterController Script von Sascha aber funktioniert nun auch für alle 3 Dimensionen. Gesetzt werden kann die Geschwindigkeit, Sprungstärke, Luftbewegstärke, Schwerkraft, sowie die Animationskomponente, die die dazugehörigen Animationen abspielen(ich habe das Model immer in einem seperaten GameObject). Als Kamera wird das erste Objekt geschnappt, dass mit dem "Main Camera" Tag ausgesatattet ist.

 

Einziger Haken ist bisweilen die Ausrichtung in die Laufrichtung. Ich bekomme schlussendlich zwar einen schönen Richtungsvektor raus, aber da ich ihn mittels transform.Translate an den Charakter anwende und in den Worldspace umrechne, hat das die Auswirkung, dass er nach seiner Drehung um 90° gleich im nächsten Frame nochmal um 90° gedreht wird.(angenommen man läuft jetzt genau nach rechts). Zwischenlösung: Ein Objekt hernehmen, dass die Winkel der Kamera hat, aber mit seiner Y-Achse Immer nach oben zeigt.(Zu schade, dass es keine Emulierbaren Achsen gibt)

 

EDIT: Problem gelöst, wenn auch unschön. Beim Starten wird in der Kamera ein Unterobjekt erstellt weil dessen Transform-Komponente später benötigt wird. Skript ist also voll Funktionsfähig.

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]

public class ThirdPersonMovement: MonoBehaviour {

   public float speed = 7;
   public float jumphigh = 7;
   public float gravity = 7;
   public float aircontrolspeed = 15;
   private Transform playercamera;

   private CharacterController controller;
   public Animation animations;
   private Vector3 movedirection = Vector3.zero;
   private Transform virtualaxis;

    // Use this for initialization
   void Start () 
   {
       controller = GetComponent<CharacterController>();
       animations["Walk"].speed = 1.5f;
       playercamera = Camera.main.transform;

       GameObject BufferHolder = new GameObject();
       virtualaxis = BufferHolder.transform;
       virtualaxis.position = playercamera.position;
       virtualaxis.rotation=playercamera.rotation;
       virtualaxis.parent = playercamera;
   }


   // Update is called once per frame
   void Update () 
   {

       //Auf dem Boden
       if (controller.isGrounded)
       {
           movedirection.x = Input.GetAxis("Horizontal");
           movedirection.z = Input.GetAxis("Vertical");
           movedirection *= speed;

           //Animationen wenn man sich bewegt
           if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0)
               animations.CrossFade("Walk");
           else
               animations.CrossFade("Idle");

           //JUMP
           if (Input.GetButtonDown("Jump")) //gesprungen?
           {
               movedirection.y = jumphigh;
               animations.CrossFade("Jump");
           }
           else
               movedirection.y = -1;

       }
       else
       //In der Luft
       {
           movedirection.x += Input.GetAxis("Horizontal") * aircontrolspeed * Time.deltaTime;
           movedirection.z += Input.GetAxis("Vertical") * aircontrolspeed * Time.deltaTime;
           movedirection.y -= gravity * Time.deltaTime;
       }


       //Virtuelle Achse ist eine normalisierte Kameraachse
       Vector3 adjustedvirtualaxisvec = playercamera.eulerAngles;
       adjustedvirtualaxisvec .x = 0;
       virtualaxis.eulerAngles = adjustedvirtualaxisvec ;


       //Sollte die Kamera leicht schräg stehen, wirkt die Schwerkraft natürlich auch schräg, was wir ja nicht wollen
       Vector3 adjustedbewegungsrichtung = virtualaxis.TransformDirection(movedirection.x, 0, movedirection.z); //Alle Werte außer Schwerkraft übernehmen
       Vector3 inputvektor = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); //All the Inputs

       if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0)
       {
           transform.rotation=Quaternion.LookRotation(virtualaxis.TransformDirection(inputvektor ));
       }

       adjustedbewegungsrichtung .y = movedirection.y; //Und sie nun hinzuaddieren;

       controller.Move(adjustedbewegungsrichtung * Time.deltaTime);
       }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...