Voilà le résultat sur un niveau encore "bac à sable" avec un personnage en cours d'élaboration (c'est censé être un astronaute au final) :
ça marche très bien et je te remercie encore pour ton aide Djulio74 !
(enfin très bien, il y a des choses bizarres à l'animation, le saut en hauteur n'est pas réglé au niveau des transitions, la pose est bizarre on dirait qu'il fait de la "air-chaise roulante" en lévitation quand il saute mais je règlerai ça plus tard)
j'ai un petit soucis visiblement avec le multiplicateur de vitesse pour la course qui ne semble pas s'activer depuis que j'ai mis les animations. je ne sais pas ce que j'ai pu faire de mal dans le code en intégrant les animations... ???
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class Script_Controles_V3 : MonoBehaviour
{
CharacterController characterController;
public GameObject AnimatorCible;
private Animator monAnim;
public float VitesseMarche = 3.0f; // Vitesse de la marche
public float CourseMultiplicateur = 8.0f; // multiplicateur pour passer de la Vitesse de marche a celle de courir
public float LongueurSautAvant = 5.0f; // la longeur du saut en avant
public float HauteurSautAvant = 2.0f; // hauteur général d'un saut
public float HauteurSaut = 4.5f; // hauteur général d'un saut
private float Vitesse = 0.0f; // Vitesse calculée en fonction des input
private float gravity = 9.81f; // force de gravité pour simuler la retombée d'un saut
private Vector3 moveDirection = Vector3.zero; // la direction général à donner au controler
private float direction = 1.0f; // permet de savoir si on va a gauche ou a droite
void Awake()
{
// Chercher l'Animator sur le perso.
// monAnim = AnimatorCible.GetComponent<Animator>();
}
void Start()
{
// Assignerle controler en prenant celui présent sur le perso.
characterController = GetComponent<CharacterController>();
monAnim = AnimatorCible.GetComponent<Animator>();
}
void Update()
{
if (characterController.isGrounded)
{
// MARCHER
// defini la Vitesse de deplacement en fonction de l'axe horizontal des input
Vitesse = Input.GetAxis("Horizontal") * VitesseMarche;
monAnim.SetFloat("ConditionMarcher", Mathf.Abs(Vitesse));
// COURIR
// si la touche course (ici leftControl) est appuyé, mutiplie la Vitesse par le CourseMultiplicateur
if (Input.GetKeyDown(KeyCode.LeftControl)) { Vitesse *= CourseMultiplicateur; monAnim.SetFloat("ConditionCourir", 1); }
else if (Input.GetKeyUp(KeyCode.LeftControl)) { monAnim.SetFloat("ConditionCourir", 0); }
// on assigne le deplacement sur l'axe x avec la Vitesse
moveDirection.x = Vitesse;
// S'ACCROUPIR
// si la touche vers le bas est pressée, le perso se baisse
if (Input.GetKeyDown(KeyCode.DownArrow)) { monAnim.SetFloat("ConditionSaccroupir", 1); }
else if (Input.GetKeyUp(KeyCode.DownArrow)) { monAnim.SetFloat("ConditionSaccroupir", 0); }
// MARCHER ACCROUPI
// directement dans l'animator
// ORIENTATION, RETOURNEMENT
// on defini la direction que doit avoir le pero, en fonction du signe de Vitesse, en evitant de comparer avec zero
if (Vitesse > 0) direction = 1.0f;
else if (Vitesse < 0) direction = -1.0f;
// on compare la direction du perso (la direction qui pointe devant lui, on retourne le perso s'il est différent de la direction
if (transform.forward != Vector3.right * direction) { transform.forward = Vector3.right * direction; }
// SAUT EN HAUTEUR
// si on appui sur leftShift, on saute. Sur place si on avance pas, sinon dans la direction du deplacement
if (Input.GetKeyDown(KeyCode.LeftShift))
{
moveDirection.y = HauteurSaut;
monAnim.SetBool("ToucheLeSol", false);
}
else { monAnim.SetBool("ToucheLeSol", true); }
// SAUT EN AVANT
// Variante du saut pour faire un saut en avant même si on avance pas, ici avec la touche W
if (Input.GetKeyDown(KeyCode.W) && Vitesse == 0)
{
moveDirection.y = HauteurSautAvant;
moveDirection.x = LongueurSautAvant * direction;
monAnim.SetFloat("ConditionSautEnAvantFloat", 1);
}
else { monAnim.SetFloat("ConditionSautEnAvantFloat", 0); }
}
// GRAVITE
// On ajoute a la Vitesse une force de gavité pour la simuler
moveDirection.y -= gravity * Time.deltaTime;
// on demande au controler de bouger le perso d'après tout ce qu'on a calculé.
characterController.Move(moveDirection * Time.deltaTime);
}
}
et la marche accroupie se comporte un peu bizarrement, il continue à marcher alors que je n'appuie plus et a du mal à repasser à la phase "idle" de l'anim de temps en temps, il bloque un peu. ça se débloque quand j'appuie sur le saut vertical. je ne sais pas ce qui se passe, si ça se joue au niveau des conditions de l'animator, ou si c'est un soucis que j'ai crée en intégrant les anims dans le code (je suis en train de regarder ce qui peut coincer).