Ich arbeite gerade an der Bewegung meines Charakters in Unity3D . Ich habe es geschafft, ihn relativ zum Mauszeiger zu bewegen. Ich habe eine Neigungsgrenze von 45 ° festgelegt, die es dem Charakter nicht erlaubt, mit höheren Graden die Berge hinaufzugehen. Aber er kann sie trotzdem hochspringen.
Wie schaffe ich es, ihn wieder nach unten rutschen zu lassen, wenn er an Stellen mit zu hoher Neigung sprang?
Danke im Voraus.
edit: Codefragment meiner Grundbewegung. mit UnityEngine; using System.Collections;
public class BasicMovement : MonoBehaviour {
private float speed;
private float jumpSpeed;
private float gravity;
private float slopeLimit;
private Vector3 moveDirection = Vector3.zero;
void Start()
{
PlayerSettings settings = GetComponent<PlayerSettings>();
speed = settings.GetSpeed();
jumpSpeed = settings.GetJumpSpeed();
gravity = settings.GetGravity();
slopeLimit = settings.GetSlopeLimit();
}
void Update() {
CharacterController controller = GetComponent<CharacterController>();
controller.slopeLimit = slopeLimit;
if (controller.isGrounded) {
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump")) {
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
Antworten:
Ihr Bremsen, wenn der Boden getroffen wird, ist falsch. Sie stoppen einfach die vertikale Bewegung, aber so funktioniert ein Bodenschlag nur, wenn der Boden flach ist.
Was Sie tun sollten, ist
moveDirection
auf die Oberfläche zu projizieren, die getroffen wird, die Ihnen das Neue gibtmoveDirection
. Wenn Ihre Bibliothek eine Funktion zum Projizieren eines Vektors auf eine Ebene oder Oberfläche hat, sollten Sie diese verwenden. Wenn nicht, sollten Sie diemoveDirection
Projektion auf die Oberflächennormale von sichmoveDirection
selbst subtrahieren .quelle
Überprüfen Sie vor dem Springen, ob der Charakter auf einem Boden steht. Ich meine, wenn er sich nicht auf einem hohen Winkel befindet. und alles andere der Physik-Engine überlassen.
Anhand des von Ihnen angegebenen Codes kann ich sehen, wo das Problem liegt:
gemäß Skriptverweis Unity ,
CharacterController.isGrounded
Rückkehr nur dann , wenn Zeichen auf den Boden berühren. Es wird nicht nach Slopelimit gesucht. Nach ein wenig Suchen scheint FPSWalkerEnhanced etwas zu sein, das Ihr Problem löst.quelle