Nutty Geschrieben 24. März 2017 Melden Share Geschrieben 24. März 2017 Hallo. Ich habe bei meiner Kamera-/Spielersteuerung das Problem, dass man nicht wirklich im Kreis laufen kann. Wenn es funktioniert, soll es ungefähr so wie bei The Legend of Zelda: Wind Waker oder vielen anderen Third Person Spielen aussehen, dass wenn man gerade nach links oder rechts läuft, man im Kreis um die Kamera läuft. Momentan läuft der Spieler aber gerade nach links oder rechts. Was ich schon probiert habe: - Die Kamera ein Stück vor den Spieler rotieren, sodass der Spieler nachzieht. Funktioniert an sich auch, aber um den Laufkreis davon klein genug zu bekommen, muss ich die Kamera zu weit rotieren und der Spieler ist nicht mehr auf dem Bildschirm. - Die Kamera ein Stück vor den Spieler rotieren und die Position entsprechend anzupassen. Dabei fliegt die Kamera einfach weg. - Den Spieler weiter zu rotieren, als er müsste. Dabei läuft er dann einfach schief. - Dem Spieler extra Velocity oder AddForce mitgeben, relativ zum Spieler nach links oder rechts. Dabei passiert einfach nichts. Jetzt weiß ich leider nicht mehr weiter, was man noch probieren könnte, weshalb ich hoffe, dass ihr mir weiterhelfen könnt. Hier mein Code: Kamera-Script using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraMovementController : MonoBehaviour { CameraMovementData movementData; Vector3 velocity = Vector3.zero; private void Start() { movementData = new CameraMovementData(); } private void Update() { movementData.CurrentX += Input.GetAxis("Mouse X") * movementData.Sensitivity; movementData.CurrentY += Input.GetAxis("Mouse Y") * -movementData.Sensitivity; movementData.CurrentY = Mathf.Clamp(movementData.CurrentY, movementData.MinY, movementData.MaxY); } private void LateUpdate() { Vector3 targetPosition = movementData.TargetTransform.position + Quaternion.Euler(movementData.CurrentY, movementData.CurrentX, 0) * new Vector3(0, 0, -movementData.MinDistance); transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.1f); transform.LookAt(movementData.TargetTransform.position); } } Spieler-Script using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovementController : PlayerCommonController{ PlayerMovementData movementData; private void Start() { movementData = new PlayerMovementData(); movementData.DistanceToGround = GetComponent<Collider>().bounds.extents.y + movementData.GroundCheckSpacing; } private void Update() { movementData.IsGrounded = GroundCheck(); if (movementData.IsGrounded && Input.GetButtonDown("Jump")) { movementData.VerticalVelocity = movementData.JumpPower; } else if (!movementData.IsGrounded && movementData.CanDoubleJump && Input.GetButtonDown("Jump")) { movementData.VerticalVelocity = movementData.JumpPower; movementData.CanDoubleJump = false; } else movementData.VerticalVelocity -= movementData.Gravity * Time.deltaTime; if (movementData.VerticalVelocity < 0 && movementData.IsGrounded) { movementData.VerticalVelocity = 0; movementData.CanDoubleJump = true; } } void FixedUpdate() { Vector3 forward = movementData.CameraObject.transform.forward; Vector3 right = movementData.CameraObject.transform.right; forward.y = 0f; Vector3 newDirection = (forward * movementData.InputZ) + (right * movementData.InputX); movementData.Movement = newDirection.normalized; newDirection.y = movementData.VerticalVelocity; movementData.Movement = new Vector3(movementData.Movement.x, newDirection.y, movementData.Movement.z); if (movementData.Movement.magnitude != 0) transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.Movement.x, 0, movementData.Movement.z) * movementData.SmoothRotation); movementData.PlayerRigid.velocity = movementData.Movement * movementData.MovementSpeed; //Icephysics V1.0 //movementData.PlayerRigid.velocity = Vector3.Lerp(movementData.PlayerRigid.velocity, new Vector3(movementData.Movement.x * movementData.MovementSpeed * 10f, movementData.Movement.y * movementData.MovementSpeed * 10f, movementData.Movement.z * movementData.MovementSpeed * 10f), Time.deltaTime); } private bool GroundCheck() { return Physics.Raycast(transform.position, Vector3.down, movementData.DistanceToGround); } } Nutty Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Nutty Geschrieben 24. März 2017 Autor Melden Share Geschrieben 24. März 2017 Habs gelöst bekommen! Ich musste die Rotation um die y-Achse direkt anpassen. Und zwar nachdem überprüft wird, ob es gerade einen Input in die entsprechende Richtung gibt. Mein Kamera-Script sieht jetzt so aus: using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraMovementController : MonoBehaviour { CameraMovementData movementData; Vector3 velocity = Vector3.zero; private void Start() { movementData = new CameraMovementData(); } private void Update() { if (movementData.InputX != 0) movementData.CurrentX += movementData.InputX * movementData.walkingRadius; else movementData.CurrentX += Input.GetAxis("Mouse X") * movementData.Sensitivity; movementData.CurrentY += Input.GetAxis("Mouse Y") * -movementData.Sensitivity; movementData.CurrentY = Mathf.Clamp(movementData.CurrentY, movementData.MinY, movementData.MaxY); } private void LateUpdate() { Vector3 targetPosition = movementData.TargetTransform.position + Quaternion.Euler(movementData.CurrentY, movementData.CurrentX, 0) * new Vector3(0, 0, -movementData.MinDistance); transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.1f); transform.LookAt(movementData.TargetTransform); } } Wobei InputX der Input auf der Horizontalen Achse ist und walkingRadius die größe des Kreises angibt, die der Spieler läuft. 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.