Actualmente estoy trabajando en el movimiento de mi personaje en Unity3D . Logré hacer que se moviera relativamente al cursor del mouse. Establecí un límite de pendiente de 45 °, que no permite que el personaje suba las montañas con grados más altos. Pero aún puede saltarlos.
¿Cómo logro hacer que se deslice hacia abajo nuevamente cuando saltó a lugares con pendiente demasiado alta?
Gracias por adelantado.
editar: fragmento de código de mi movimiento básico. usando UnityEngine; usando 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);
}
}
Respuestas:
Su frenado cuando se golpea el suelo es incorrecto, simplemente detiene el movimiento vertical, pero así es como funciona un golpe de suelo cuando el suelo es plano.
Lo que debe hacer es proyectar
moveDirection
en la superficie que se golpea, eso le dará lo nuevomoveDirection
. Si su biblioteca tiene una función para proyectar un vector en un plano o superficie, eso es lo que debe usar. Si no, debe restarmoveDirection
la proyección de la superficie normal demoveDirection
sí misma.fuente
solo verifique antes de saltar si el personaje está parado en el suelo, es decir, si no está en una pendiente elevada. y dejar cualquier otra cosa al motor de física.
Según el código que proporcionó, puedo ver dónde está el problema:
de acuerdo con la referencia del script Unity ,
CharacterController.isGrounded
solo regresa si el personaje toca el suelo. no comprueba el slopelimit. después de buscar un poco, FPSWalkerEnhanced parece ser algo que resuelve su problema.fuente