[Shooter2D][DB][C#] Animation de tir du personnage en cliquant [Résolu]

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Darklombax
Messages : 6
Inscription : 25 Nov 2016 21:10

[Shooter2D][DB][C#] Animation de tir du personnage en cliquant [Résolu]

Message par Darklombax » 01 Déc 2016 00:13

Bonjour/Bonsoir a tous/toutes,

Je viens avec une petite interrogation j'ai dans le code qui suit mis un input Mousebutton ( clique gauche ) mais si je lui joint l'animation de tir elle boucle jusqu'a ce que je "reclique" sur la touche alors que je veux juste la faire jouer une seul fois et bien sur qu'il joue l'animation uniquement quand je clique.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerControl : MonoBehaviour {

	//variable de movement
	public float maxSpeed;

	//variable de saut
	bool grounded = false;
	float CheckSolRadius = 0.2f;
	public LayerMask SolLayer;
	public Transform CheckSol;
	public float jumpHeight;

	//variable de transformation
	Rigidbody2D RB;
	Animator anim;
	bool facingRight;

	//Pour tirer

	public Transform gunTip;
	public GameObject bullet;
	public float fireRate = 0.5f;
	float nextFire = 0f;


	// Use this for initialization
	void Start () {
		RB = GetComponent<Rigidbody2D>();
		anim = GetComponent<Animator>();


		facingRight = true;
	}

	// Update is called once per frame
	void Update(){
		if(grounded && Input.GetAxis("Jump")>0){
			grounded = false;
			anim.SetBool("touchSol",grounded);
			RB.AddForce(new Vector2(0,jumpHeight));
		}

		//Player tire
		if (Input.GetMouseButtonDown (0)) fireBullet ();{
		anim.SetBool ("Shoot",true);
		}
	}


	void FixedUpdate () {

		//Check si on est au sol - si non on tombe
		grounded = Physics2D.OverlapCircle(CheckSol.position,CheckSolRadius,SolLayer);
		anim.SetBool("touchSol",grounded);

		anim.SetFloat ("JumpHeight", RB.velocity.y);


		float move = Input.GetAxis ("Horizontal");
		anim.SetFloat ("Speed", Mathf.Abs (move));

		RB.velocity = new Vector2 (move * maxSpeed, RB.velocity.y);

		if (move > 0 && !facingRight) {
			flip ();

		} else if(move<0&&facingRight){
			flip ();
		}
			
			

		}
	void flip(){
		facingRight = !facingRight;
		Vector3 theScale = transform.localScale;
		theScale.x *= -1;
		transform.localScale = theScale;
	}

	void fireBullet(){
		if (Time.time > nextFire) {
			nextFire = Time.time + fireRate;
			if (facingRight) {
				Instantiate (bullet, gunTip.position, Quaternion.Euler (new Vector3 (0, 0, 0)));
			} else if (!facingRight) {
				Instantiate (bullet, gunTip.position, Quaternion.Euler (new Vector3 (0, 0, 180f)));
			}
		}
	}

}
Edit : Autant pour moi, je pensais être clair, voici donc le code en entier et oui le joueur tire dans la fonction update.


Je vous remercie d'avance pour le temps que vous m'accorder.

Nicolas V.
Dernière édition par Darklombax le 01 Déc 2016 14:56, édité 3 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par boubouk50 » 01 Déc 2016 10:43

Oula, je te conseille en premier lieu de voir les bases de la programmation POO.

Déjà, je ne comprends pas comment ton script puisse marcher:
- La fonction Start () n'est jouée qu'au démarrage de la scène. Donc le clic, n'est plus pris en compte ensuite.
- Une condition if joue ce qu'elle possède entre ses accolades ou à défaut, la ligne unique suivante.

Je soupçonne donc une fonction Update () quelque part avec ce même code. Et on n'a pas non plus la fonction FireBullet ().
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par Moi 1971 » 01 Déc 2016 11:06

Oui, Boubouk à raison. Il faut nous montrer l'ensemble de ton code et non pas des bouts comme ça.. On comprend rien!

Darklombax
Messages : 6
Inscription : 25 Nov 2016 21:10

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par Darklombax » 01 Déc 2016 12:54

Bonjour/Bonsoir

J'ai éditer mon premier post désolé pour la non-clarté de mon code

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par boubouk50 » 01 Déc 2016 13:13

Ouais du coup, le code, rien à voir... Bonjour, j'ai un problème au moteur alors j'ai mis les pièces qui me semblent en cause dans le coffre et les ai ré-assemblées...
Désolé pour le sarcasme, mais ce doit être dit d'une manière ou d'une autre, je ne comprends pas pourquoi quand un code bogue, certains d'entre vous ne nous refilent que quelques morceaux, et en plus les changent de place... Ça n'a aucun sens de faire cela. /*Fin de l'aparté*/
Je reviens sur ma première réponse et la condition if et ses accolades:

Code : Tout sélectionner

if (condition) {
	...; //Alors je fais tout ce qu'il y a entre les accolades
}
ou bien

Code : Tout sélectionner

if (condition) 
	...; //Alors je fais ça, et uniquement cette ligne
Ici, ce n'est pas ce que tu fais.
Tu lances FireBullet (); puis tu mets des accolades (qui n'y étaient pas dans le premier code d'ailleurs). Donc seul FireBullet (); est pris en compte dans le if, anim.SetBool ("Shoot",true); étant exclu de la condition, elle est appelée à chaque frame.
Il faut mettre les accolades après la condition sinon elles ne sont pas considérées comme partie de la condition.

J'en reviens donc encore à mon premier post: je te conseille en premier lieu de voir les bases de la programmation POO. La condition est une base fondamentale et de niveau débutant. Si tu ne l'as pas, c'est que tu ne codes pas, mais tu farfouilles, et pour faire un jeu, il faut plus que farfouiller, il faut apprendre. Tu ne buteras ainsi plus sur ce genre de problème très simple.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par Moi 1971 » 01 Déc 2016 13:42

Pour aller dans le sens de Boubouk,
les problèmes de IF - ELSE sont ici:

Code : Tout sélectionner

//Player tire
      if (Input.GetMouseButtonDown (0)) fireBullet ();{
      anim.SetBool ("Shoot",true);
      }
et :

Code : Tout sélectionner

if (facingRight) {
            Instantiate (bullet, gunTip.position, Quaternion.Euler (new Vector3 (0, 0, 0)));
         } else if (!facingRight) {
            Instantiate (bullet, gunTip.position, Quaternion.Euler (new Vector3 (0, 0, 180f)));
         }
De plus, (je suis pas un pro du tout des anim's) je ne vois pas dans ton code où tu mets à false l'animation qui boucle et qui te pose problème. Cette animation a peut-être aussi le paramètre "boucle tout le temps" d'activée? (je connais bien le sujet, c'est peut-être pas ça)

Darklombax
Messages : 6
Inscription : 25 Nov 2016 21:10

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant

Message par Darklombax » 01 Déc 2016 14:55

Bonjour/Bonsoir,

Merci beaucoup j'ai compris ou était mon erreur.

Code : Tout sélectionner

if (Input.GetMouseButtonDown (0)) {
			fireBullet ();
			anim.SetBool ("Shoot", true);
		} else if (!Input.GetMouseButtonDown (0)) {
			anim.SetBool ("Shoot", false);
		}
PS: Pour apprendre les bases de la programmation POO, je pense aller sur OpenClassrooms ou vous me conseillez un autre site ?

Nicolas V.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Shooter2D][DB][C#] Animation de tir du personnage en cliquant [Résolu]

Message par boubouk50 » 01 Déc 2016 15:13

Euh oui, effectivement, même si ce n'est toujours pas vraiment cela. En soit, le code est juste, mais il est... euh... je trouve pas le mot.

Une condition est un interrupteur: oui ou non. Si c'est l'un c'est pas l'autre, si c'est l'autre c'est pas l'un. Et il n'y à que 2 cas.
Alors écrire: si c'est pas l'un, c'est l'autre si c'est l'autre. C'est redondant et un peu absurde.

Code : Tout sélectionner

if (Input.GetMouseButtonDown (0)) {
	fireBullet ();
	anim.SetBool ("Shoot", true);
}
else { //le else par définition c'est déjà la condition inverse du if donc !Input.GetMouseButtonDown (0)), pas besoin de le re-spécifier
	anim.SetBool ("Shoot", false);
}
Là, ce sera déjà mieux.
Ensuite (et là on commence un peu à aller plus loin dans la programmation, mais déjà c'est suffisant), cela veut dire que SetBool () sera appelé à chaque frame où tu ne cliques pas pour le remettre à false. C'est encore redondant et inutile. Il faudrait gérer un événement unique à partir du clic qui te permettrait de mettre ton booléen à true puis à false une fois fini, ou bien de gérer l'animation différemment pour que l'animation ne se joue qu'une seule fois et pas en boucle.

Tu pourrais également sortir le SetBool () de la condition puisqu'il prend en paramètre le résultat même de la condition.

Code : Tout sélectionner

bool isClic = Input.GetMouseButtonDown (0);
if (isClic)
	fireBullet ();
anim.SetBool ("Shoot", isClic);
Pour les liens vers l'apprentissage, tu as ce Thread (là je t'ai mis directement le lien vers la réponse de POO, mais tu peux lire tout le thread). Y'a aussi des liens dans ce post. Sinon, OpenClassRoom est très bien également.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »