[RESOLU][DB-AL] Gerer un intermediaire
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
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
[RESOLU][DB-AL] Gerer un intermediaire
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é.
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é.
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Gerer un intermediaire
Moi, j'ai peut-être la solution. Mais j'aime aussi cultiver le mystère en ne donnant pas l'information nécessaire.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Gerer un intermediaire
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é):
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;
}
}
}
}
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Gerer un intermediaire
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?
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Gerer un intermediaire
Ma version de Unity:
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 :
Actuellement j’accède a mon enfant "boxCoin".
alors que je veux accéder à l'enfant "GoldCoins";
Voici le code actuel:
Script Goldcoin:
Script Boxcoin:
Edit:
J'ai cette erreur avec la fonction Play:
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 :
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");
}
}
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;
}
}
}
}
J'ai cette erreur avec la fonction Play:
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Gerer un intermediaire
Encore le même problème:
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.
Ton Find () va chercher le premier BoxCoins+Coins qu'il trouve.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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Gerer un intermediaire
Il n'accepte pas le "in"
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Gerer un intermediaire
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Gerer un intermediaire
J'ai cette erreur quand je lance le jeux:
il sagit de ces lignes :
Et cette erreur quand mon Player touche le Boxcoins:
ligne 29 :
Voici le code:
Boxcoin:
GoldCoins:
il sagit de ces lignes :
Code : Tout sélectionner
animRenderer = goldCoin.GetComponent<Renderer> ();
animGC = goldCoin.GetComponent<GoldCoins>();
animRenderer.enabled = false;
ligne 29 :
Code : Tout sélectionner
animRenderer.enabled = true;
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;
}
}
}
}
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");
}
}
- boubouk50
- ModoGenereux
- Messages : 6243
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Gerer un intermediaire
Ç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.
Ç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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation