[RESOLU][DB-AL] Gerer un intermediaire

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
hercull
Messages : 34
Inscription : 20 Août 2017 00:58

[RESOLU][DB-AL] Gerer un intermediaire

Message par hercull » 05 Sep 2017 16:59

Bonjour,

J'aimerai que lorsque mon Player touche un carré il y es une pièce (gold) qui joue une animation.
Avec mon code cela fonctionne pour 1 seul carré et une seule pièce, si je duplique ces 2 objets lorsque mon Player touche le carré toutes les pièces du jeux joue l'animation, car je passe par le tag de la pièce.

Je ne sais pas comment faire pour que ce soit uniquement la pièce rattaché au carré qui joue l'animation.

Je précise qu'il y a un intermédiaire : le Player touche le carré et la pièce joue l'animation, le Player ne touche pas directement la pièce.

J'ai un script pour le Player, un script pour la pièce et un script pour le carré.

Image

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

Re: [DB-AL] Gerer un intermediaire

Message par boubouk50 » 05 Sep 2017 18:54

hercull a écrit :
05 Sep 2017 16:59
J'ai un script pour le Player, un script pour la pièce et un script pour le carré.
Moi, j'ai peut-être la solution. Mais j'aime aussi cultiver le mystère en ne donnant pas l'information nécessaire. :roll:
"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

hercull
Messages : 34
Inscription : 20 Août 2017 00:58

Re: [DB-AL] Gerer un intermediaire

Message par hercull » 05 Sep 2017 19:10

Lol

Mon but n’était pas de cacher mon code, je m'attendais à recevoir plutôt "la façon de procéder" plutôt qu'un script, mais pas de soucis je post le script:

Script de la box(carré):

Code : Tout sélectionner

public class BoxCoins : MonoBehaviour {

	public Animator Anim;
	public Renderer AnimRenderer;
	public bool BoxUsed = false;


    void Start() {
        Anim = GameObject.FindGameObjectWithTag("GoldCoins").GetComponent<Animator>();
		AnimRenderer = GameObject.FindGameObjectWithTag ("GoldCoins").GetComponent<Renderer> ();
		AnimRenderer.enabled = false;
    }

	void OnCollisionEnter2D(Collision2D col){
		if (col.gameObject.tag == "Player")
		{
			if (BoxUsed == false) {
				AnimRenderer.enabled = true;
				Anim.SetTrigger ("CoinsUp");
				BoxUsed = true;
			}
		}

	}
}

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

Re: [DB-AL] Gerer un intermediaire

Message par boubouk50 » 05 Sep 2017 19:29

Disons que c'est tout de même ton code qui fait mal les choses, donc autant te l'expliquer. Et puis, ça nous fait gagner du temps.

Tu as quelle version d'Unity?
GameObject.FindGameObjectWithTag () n'est pas répertorié dans la doc depuis la V5... ni la 4.6...

De toute manière, un Find () va chercher le premier qu'il trouve. Déjà, c'est pas bon si tu as plusieurs objets avec ce tag. Il faut aller chercher le bon.
Dans ton cas, il vaut mieux aller chercher dans les enfants via GetComponentInChildren ().
Comme cela tu récupères le bon enfant déjà.
Ensuite, n'étant pas très très avancé sur les animations via script, je ne sais pas si l'animation est liée au GameObject ou non. Si c'ets le cas, alors pas de souci, sinon toutes les occurrences utilisant cette animation vont la jouer.
Aussi, il vaut mieux que ce soit la pièce elle même qui ait le script d'animation. Le Collider de la boite va simplement appeler la fonction nécessaire et la pièce jouera son animation.
Ne peux-tu pas passer par anim.Play () plutôt que qu'un trigger d'animation?
"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

hercull
Messages : 34
Inscription : 20 Août 2017 00:58

Re: [DB-AL] Gerer un intermediaire

Message par hercull » 06 Sep 2017 11:15

Ma version de Unity:

Image

J'ai mis le script d'animation sur la pièce.
Seulement je n’arrive pas à accéder au bon enfant , surement du à mon arborescence :

Image

Actuellement j’accède a mon enfant "boxCoin".
alors que je veux accéder à l'enfant "GoldCoins";

Voici le code actuel:

Script Goldcoin:

Code : Tout sélectionner

public class GoldCoins : MonoBehaviour
{
	public Animator Anim;
    public GameObject coin;

    // Use this for initialization
    void Start()
    {
		Anim = GetComponent<Animator>();
        //coin.SetActive(false);
    }
		
	public void PlayAnim()
	{
		Anim.Play ("CoinsUp");
	}

}
Script Boxcoin:

Code : Tout sélectionner

public class BoxCoins : MonoBehaviour {

	public Animator Anim;
	public Renderer AnimRenderer;
	public bool BoxUsed = false;


    void Start() {
		//Anim = GameObject.Find ("BoxCoins+Coins").GetComponent<GoldCoins> ().PlayAnim ();
		AnimRenderer = GameObject.Find("BoxCoins+Coins").GetComponentInChildren<Renderer>();
		AnimRenderer.enabled = false;
    }

	void OnCollisionEnter2D(Collision2D col){
		if (col.gameObject.tag == "Player")
		{
			if (BoxUsed == false) {
				AnimRenderer.enabled = true;
				GameObject.Find("BoxCoins+Coins").GetComponentInChildren<GoldCoins>().PlayAnim();
				//Anim.SetTrigger ("CoinsUp");
				BoxUsed = true;
			}
		}

	}
}
Edit:

J'ai cette erreur avec la fonction Play:

Image

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

Re: [DB-AL] Gerer un intermediaire

Message par boubouk50 » 06 Sep 2017 11:31

Encore le même problème:
De toute manière, un Find () va chercher le premier qu'il trouve. Déjà, c'est pas bon si tu as plusieurs objets avec ce tag. Il faut aller chercher le bon.
Ton Find () va chercher le premier BoxCoins+Coins qu'il trouve.
Pour surfer dans la hiérarchie tu as transform.parent (pour monter) ou transform.root (pour aller tout en haut) puis GetChild () pour les enfant et GetComponentInChildren ().

Donc ici, depuis BoxCoin, il te faut d'abord aller sur le parent (transform.parent) puis faire le GetComponentInChildren (). Attention, il renvoie également le premier qu'il trouve donc il faut que seul GoldCoins ait une animation. Il vaut donc mieux récupérer le bon node. Puis à partir de celui-ci récupérer ses components.

Code : Tout sélectionner

public class BoxCoins : MonoBehaviour {

	private GoldCoins animGC;
	private Renderer animRenderer;
	private GameObject goldCoin;
	private bool BoxUsed = false;


    void Start() {
    		//Chercher par le bon enfant à partir du parent commun par le nom
		for (transform child in transform.parent){
      			 if (child.name == "GoldCoins")
      			 	goldCoin = child.gameObject;
       		}
       		//Récupérer les Components utiles
       		animRenderer = goldCoin.GetComponent <Renderer> ();
       		anim = goldCoin.GetComponent <GoldCoins> ();
		animRenderer .enabled = false;
    }

	void OnCollisionEnter2D(Collision2D col){
		if (col.gameObject.tag == "Player")
		{
			if (BoxUsed == false) {
				AnimRenderer.enabled = true;
				goldCoin.PlayAnim();
				BoxUsed = true;
			}
		}

	}
}
"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

hercull
Messages : 34
Inscription : 20 Août 2017 00:58

Re: [DB-AL] Gerer un intermediaire

Message par hercull » 06 Sep 2017 11:53

Il n'accepte pas le "in"

Image

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

Re: [DB-AL] Gerer un intermediaire

Message par boubouk50 » 06 Sep 2017 12:14

foreach au lieu de for.

Pour ton pb d'index, c'est lié à ton Component Animator ou Animation. Il doit essayer de lire une animation qui n'existe pas.
"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

hercull
Messages : 34
Inscription : 20 Août 2017 00:58

Re: [DB-AL] Gerer un intermediaire

Message par hercull » 06 Sep 2017 13:01

J'ai cette erreur quand je lance le jeux:

Image

il sagit de ces lignes :

Code : Tout sélectionner

	
		animRenderer = goldCoin.GetComponent<Renderer> ();
		animGC = goldCoin.GetComponent<GoldCoins>();
		animRenderer.enabled = false;
Et cette erreur quand mon Player touche le Boxcoins:

Image

ligne 29 :

Code : Tout sélectionner

				animRenderer.enabled = true;
Voici le code:

Boxcoin:

Code : Tout sélectionner

public class BoxCoins : MonoBehaviour {

	private GoldCoins animGC;
	private Renderer animRenderer;
	private GameObject goldCoin;
	public bool BoxUsed = false;


    void Start() {
		//Chercher par le bon enfant à partir du parent commun par le nom
		foreach(Transform child in transform.parent){
			if (child.name == "GoldCoins")
				goldCoin = child.gameObject;
		}
		//Récupérer les Components utiles
		animRenderer = goldCoin.GetComponent <Renderer> ();
		animGC = goldCoin.GetComponent <GoldCoins> ();
		animRenderer .enabled = false;
    }

	void OnCollisionEnter2D(Collision2D col){
		if (col.gameObject.tag == "Player")
		{
			if (BoxUsed == false) {
				animRenderer.enabled = true;
				animGC.PlayAnim ();
				//Anim.SetTrigger ("CoinsUp");
				BoxUsed = true;
			}
		}

	}
}
GoldCoins:

Code : Tout sélectionner

public class GoldCoins : MonoBehaviour
{
	public Animator Anim;
    public GameObject coin;

    // Use this for initialization
    void Start()
    {
		Anim = GetComponent<Animator>();
        coin.SetActive(false);
    }
		
	public void PlayAnim()
	{
		Anim.Play("CoinsUp");
	}

}

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

Re: [DB-AL] Gerer un intermediaire

Message par boubouk50 » 06 Sep 2017 13:23

Ça veut dire que le Renderer n'est pas trouvé. Surement qu'il faut utiliser MeshRenderer plutôt.
Ça serait bien de commencer à comprendre un peu ce que tu fais et ce que veulent dire ces erreurs qui sont plutôt évidentes et très répertoriées sur le net. (c'est une des plus fréquentes).
Je fais tout de tête, je peux faire des erreurs.
"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 »