Jump to content
Unity Insider Forum

Nutty

Members
  • Gesamte Inhalte

    7
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Nutty

  1. Hallo. Ich versuche mich momentan an einem ordentlichen GroundCheck. Dieser funktioniert an sich auch sehr sehr gut, bis auf den einen Bug, den man im angehängten .gif sehen kann. Dabei rutscht man langsam durch oder an Kanten entlang, wenn der Spieler um ca. 45° rotiert ist. Im gif kann man auch noch sehen, dass zwischen dem Spieler(links) und dem Objekt(rechts) auch noch Platz ist (weiße Linie zwischen beiden Objekten), weshalb der Spieler das Objekt eigentlich gar nicht berühren sollte. Das merkwürdigste und die potenzielle Fehlerquelle ist, dass wenn ich mir "Player.Collider.bounds.extents" ausgeben lasse, verändern sich dabei x und z Wert, je nach Rotation um die y-Achse. So gehen diese beiden Werte von 0.5 auf bis zu 0.7, bei einer Rotation von 45° um die y-Achse. Was ich schon alles probiert habe: Bei beiden Objekten Mesh- und Box-Collider ausprobiert Bei der CollisionDetection alle drei Optionen (Discrete, Continuous, Continuous Dynamic) auf jedem Objekt ausprobiert Die Gravitation verändert, falls man zu stark nach unten gezogen werden sollte Da beide Objekte einen Rigidbody haben, bei beiden alle drei Einstellungen von Interpolate ausprobiert Da das rechte Objekt ein Modell hat, habe ich auch schon "Generate Colliders" ausprobiert Beim Modell "Optimize Mesh" an/aus Desweiteren ist der bool IsGrounded sogar während ich so am fallen bin auf true, und meine VerticalVelocity auf 0! Am rechten Objekt hängt kein Skript, am Spieler nur dieses: using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovementController : PlayerCommonController{ PlayerMovementData movementData; private void Start() { movementData = new PlayerMovementData(); } 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); if(movementData.OnIce) movementData.PlayerRigid.velocity = Vector3.Lerp(movementData.PlayerRigid.velocity, new Vector3(movementData.Movement.x * movementData.MovementSpeed, movementData.Movement.y * movementData.MovementSpeed, movementData.Movement.z * movementData.MovementSpeed), movementData.SlideStrength * Time.deltaTime); else movementData.PlayerRigid.velocity = movementData.Movement * movementData.MovementSpeed; } private bool GroundCheck() { Vector3 extents = new Vector3(transform.localScale.x / 2, 0, transform.localScale.z / 2); return Physics.BoxCast(transform.localPosition, extents, Vector3.down, Quaternion.identity, (transform.localScale.y / 2) + movementData.GroundCheckSpacing); } void OnTriggerEnter(Collider coll) { if (coll.gameObject.tag == "Ice") movementData.OnIce = true; } void OnTriggerExit(Collider coll) { movementData.OnIce = false; } } Ich hoffe, dass mir jemand weiter helfen kann. Nutty P.S: Ignoriert bitte einfach die Grafikfehler im gif, die sind nur auf dem Rechner, von dem ich dies hier geschrieben habe.
  2. 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.
  3. Nutty

    Als Spieler im Kreis laufen

    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
×
×
  • Neu erstellen...