Je travaille actuellement sur le mouvement de mon personnage dans Unity3D . J'ai réussi à le faire bouger relativement au curseur de la souris. J'ai défini une limite de pente de 45 °, ce qui ne permet pas au personnage de gravir les montagnes à des degrés plus élevés. Mais il peut toujours les sauter.
Comment puis-je le faire redescendre quand il a sauté à des endroits avec une pente trop élevée?
Merci d'avance.
edit: extrait de code de mon mouvement de base. en utilisant 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);
}
}
Réponses:
Votre freinage lorsque le sol est touché est incorrect, vous arrêtez simplement le mouvement vertical, mais c'est uniquement ainsi que fonctionne un coup au sol lorsque le sol est plat.
Ce que vous devez faire, c'est projeter
moveDirection
sur la surface qui est touchée, cela vous donnera le nouveaumoveDirection
. Si votre bibliothèque a une fonction pour projeter un vecteur sur un plan ou une surface, c'est ce que vous devez utiliser. Sinon, vous devez soustrairemoveDirection
la projection de la normale de la surface àmoveDirection
elle-même.la source
vérifiez juste avant de sauter si le personnage se tient sur un sol, je veux dire s'il n'est pas sur une pente élevée. et laisser quoi que ce soit d'autre au moteur physique.
sur la base du code que vous avez fourni, je peux voir où est le problème:
selon la référence du script Unity ,
CharacterController.isGrounded
ne revient que si le personnage touche le sol. il ne vérifie pas la slopelimit. après une petite recherche, FPSWalkerEnhanced semble être quelque chose qui résout votre problème.la source