Je vous met le script utiliser par ma fonction attaque, celui de ma coroutine & Le script complet de mon player:
Script pour mon attaque:
Code : Tout sélectionner
// Pour Attaquer
if (canAttaque = true && (Input.GetKey(inputAttaque)))
{
StartCoroutine(coroutAttaque());
}
else
{
animator.SetBool("attaque", false);
}
Code : Tout sélectionner
IEnumerator coroutAttaque()
{
print("Début de la coroutine & Player de peut plus attaquer");
animation.Play("sj001_skill1");
animator.SetBool("attaque", true);
canAttaque = false;
yield return new WaitForSeconds(3);
canAttaque = true;
print("Fin de la coroutine & Player peut attaquer");
}
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlePlayer : MonoBehaviour {
Animation animation;
private Animator animator;
private bool canAttaque;
//Vitesse de déplacement
public float flySpeed;
public float turnSpeed;
//Controle
public string inputFront;
public string inputSprint;
public string inputBack;
public string inputLeft;
public string inputRight;
public string inputAttaque;
public string inputCamera;
void Start()
{
animator = GetComponent<Animator>();
animation = gameObject.GetComponent<Animation>();
}
void Update()
{
// Pour Avancer
if (Input.GetKey(inputFront))
{
transform.Translate(0, 0, flySpeed * Time.deltaTime);
animation.Play("sj001_run");
animator.SetBool("run", true);
}
else
{
animator.SetBool("run", false);
}
// Pour Sprinté
if (Input.GetKey(inputFront) & Input.GetKey(inputSprint))
{
transform.Translate(0, 0, (flySpeed * 1.2f) * Time.deltaTime);
animation.Play("sj001_run");
animator.SetBool("sprint", true);
}
else
{
animator.SetBool("sprint", false);
}
// Pour Attaquer
if (canAttaque = true && (Input.GetKey(inputAttaque)))
{
StartCoroutine(coroutAttaque());
}
else
{
animator.SetBool("attaque", false);
}
// Pour Reculer
if (Input.GetKey(inputBack))
{
transform.Translate(0, 0, -(flySpeed / 6) * Time.deltaTime);
animation.Play("sj001_wait");
animator.SetBool("back", true);
}
else
{
animator.SetBool("back", false);
}
// Pour Tourner à Gauche
if (Input.GetKey(inputLeft))
{
transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);
}
// Pour Tourner à Droit
if (Input.GetKey(inputRight))
{
transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
}
}
IEnumerator coroutAttaque()
{
print("Début de la coroutine & Player de peut plus attaquer");
animation.Play("sj001_skill1");
animator.SetBool("attaque", true);
canAttaque = false;
yield return new WaitForSeconds(3);
canAttaque = true;
print("Fin de la coroutine & Player peut attaquer");
}
}
Cependant même avec ma coroutine qui fonctionne (on le voie au print) lorsque je reste appuyer sur ma touche celui ci reste geler tout de même. Ce la marche ci je met GetKeyDown au lieu de GetKey, cependant je ne veux pas être oublier de relâcher le bouton pour ré attaquer une deuxième foie. Je voudrais que ci j'appuie sur mon "z" (Bouton attaque) et que je le maintiens, mon animation d'attaque joue en boucle de 3 seconde sans geler. Donc même ci je reste appuyer mon animation part, ma coroutine commencer, mon animation joue pendent mon temps de 3 seconde, ensuite il repart tant que je reste appuyer.
Comme je suis débutante j'ai de la difficulter à voir ou est ce que sa bloque et pourquoi mon animation reste toujours geler. Ce que je comprend du principe de la couroutine c'est qu'elle devrais bloquer l’utilisation de la touche attaque tant que la coroutine est en marche, permettant de rester appuyer sur le bouton et que celui ci réagisse comme ci on appuyais une fois et qu'on attendrais que l'animation soie fini pour réappuyer de nouveaux.