Bowserkoopa Geschrieben 18. August 2011 Melden Share Geschrieben 18. August 2011 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); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. September 2011 Melden Share Geschrieben 1. September 2011 Das mit dem zusätzlichen Transform kann man nochmal besser machen, z.B. über Quaternion * Vektor. Ansonsten prima! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.