communication entre les scripts

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
Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

communication entre les scripts

Message par Kaloverian » 11 Mars 2020 02:47

bonjour,

J'ai crée 2 scripts en C# appliqués sur un même objet.
Le premier script permet à l'objet de se translater sur l'axe des X
Le second permet au moment de l' appui sur une touche spécifique de prendre et d'afficher sur la console par exemple la position x
Les 2 scripts fonctionnent.


Je suis confronté alors à ce problème:
bien que l'objet soit translaté(position.x varie),la console affiche toujours la même position.x.
Ce n'est pas normal!

Je crois que le second script ne prend pas en compte l'effet du premier script.
1)Est-ce que c'est normal?
2)Ce tuto vidéo :
https://www.youtube.com/watch?v=9m1JepMZDgs
doit-il résoudre mon problème?

On va alors me répondre d'unifier le tout dans un autre script (où ça marchera!) mais je ne le souhaite vu la complexité de mon projet que je présente là en simplifié.

merci de votre aide

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: communication entre les scripts

Message par djulio74 » 11 Mars 2020 07:49

Alors non, il n'y a aucune raison qu'un script ne prenne pas en considération un autre script, et heureusement. ;)
assigne tu les bonnes valeurs aux deux scripts? par exemple, deux script sur un même objet :
Script A :

Code : Tout sélectionner

transform.position = new Vector3(X,Y,Z);
Script B :

Code : Tout sélectionner

print( transform.position.x);
ton objet ne serait pas enfant d'un autre et tu assigne du "localposition"?

Montre nous les deux bout de code qui concernent le changement de position et l'affichage de la positon dans la console. sans ça difficile de dire ou se situe le problème.

Par rapport au "GetComponent", dans ton cas non ce n'est pas utile.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: communication entre les scripts

Message par boubouk50 » 11 Mars 2020 09:33

Poste ton code...
"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

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: communication entre les scripts

Message par Kaloverian » 11 Mars 2020 15:07

Les 2 scripts sont à attacher au même objet.

(désolé je ne trouve plus la balise code !!!)

-------------------------------------------------------------------------------------------------------
premier script C#:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class scale_one : MonoBehaviour
{  
	public float vitesse_scale;

	// Update is called once per frame
	void Update()
	{   
		Vector3 pos = transform.localScale;

		pos.x = vitesse_scale * (Time.time);
		transform.localScale = pos;
	}
}

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class verifier : MonoBehaviour    
{   
	public GameObject gameObject1,gameObject2;
	float zScal;
	public float angle;

	void Start()
	{ 
		zScal = gameObject1.GetComponent<Transform>().localScale.x;//ne prend en compte l'influence du script scale_one
	}

	// Update is called once per frame
	void Update()
	{
		Vector3 newPos = transform.position;

		if ((Input.GetKeyDown (KeyCode.F)) | (Input.GetKeyDown (KeyCode.B)))
			print("zScale : "+zScal);
	 }

}
 ! Message de : boubouk50
C'est la 5e: celle avec les <>

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

Re: communication entre les scripts

Message par boubouk50 » 11 Mars 2020 15:30

Si les deux composants sont sur le même objet, alors ce script n'a strictement aucun sens.
D'un, le transform est un component OBLIGATOIRE et donc accessible directement, tu n'as donc pas besoin de communication.
De deux, tu modifies le scale de l'objet en cours dans le 1e script mais regarde celui de gameObject1 dans le second. C'est donc normal que ça ne corresponde pas, ce n'est pas le même objet.
"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

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: communication entre les scripts

Message par djulio74 » 11 Mars 2020 19:13

J'ajouterai aussi que dans le script "verifier", tu assigne Zscale uniquement dans ta void Start, il est donc normalqu'elle ne soit pas juste car elle n'est jamais mise a jour.

Ton premier script est bon, tu assigne bien un scale local dans la fonction Update, qui est donc mis a jour a chaque frame.
par contre pour le second script :
- comme le dit boubouk, pas besoin de Getcomponent (ce que je t’avais déjà indiqué dans ma première réponse.
- assigne ton Zscale au moment ou tu presse le bouton voulu.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class verifier : MonoBehaviour    
{   
	public GameObject gameObject1,gameObject2;
	float zScal;
	public float angle;

	void Start()
	{ 
		// la Void Start est lancée uniquement au lancement de la scène, normal que zScale ne soit pas a jour.
		// cette fonction sert a initialiser des variable ou autres éléments
		// inutile //zScal = gameObject1.GetComponent<Transform>().localScale.x;
	}

	// Update is called once per frame
	void Update()
	{
		Vector3 newPos = transform.position;

		if ((Input.GetKeyDown (KeyCode.F)) | (Input.GetKeyDown (KeyCode.B)))
			// c'est ici qu'il faut assigner zScale, au moment ou tu presse F ou B : 
			// transform est LE transform du gameobject ou se trouve le script, pas besoin de GetComponent
			zScal = transform.localScale.x;
			print("zScale : "+zScal);
	 }

}
Si par contre tu cherche a recupérer des valeur relatif au transform d'autres gameobject que tu aurais mis en variable comme ton :

Code : Tout sélectionner

public GameObject gameObject1,gameObject2;
alors dans ce cas, pour récupérer le localScale.X de cet object, un simple suffit , sans recours au getcomponent :

Code : Tout sélectionner

zScal = gameObject1.transform.localScale.x;
// ou
zScal = gameObject2.transform.localScale.x;

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »