[Résolu] [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

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
TheParadox
Messages : 84
Inscription : 12 Juil 2017 19:54
Localisation : France

[Résolu] [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par TheParadox » 21 Juil 2017 16:07

Bonjour.

Je cherche à récupérer un vecteur appartenant à un GameObject en collision à l'aide la fonction OnTriggerEnter.

Voici mon code actuel :

Code : Tout sélectionner

void OnTriggerEnter (Collider collider) {
			GravityV = collider.GetComponent<GravityZone>().GravityVector;
			}
		
Mais j'obtiens l'erreur :
error CS0176: Static member `GravityZone.GravityVector' cannot be accessed with an instance reference, qualify it with a type name instead

Le script contenant le vecteur se nomme GravityZone, et le vecteur se nomme GravityVector.

Qu'est ce que je dois faire ?
Merci d'avance.
Dernière édition par TheParadox le 21 Juil 2017 18:24, édité 1 fois.
Une seule chose est sûre : rien n'est certain, car cette phrase est un mensonge.

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

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par boubouk50 » 21 Juil 2017 16:22

On peut avoir le code de GravityZone stp, c'est surement lui le criminel.

Aussi, tu pourrais séparer un peu tout ça, même si c'est moins "performant", tu devrais quand même lever les exceptions pour éviter les plantages possibles:
void OnTriggerEnter (Collider collider) {
___GravityZone gZone = collider.GetComponent<GravityZone>();
___if (gZone != null) //Eviter d'aller chercher ton vecteur dans rien et donc planter le programme
______GravityV = collider.GetComponent<GravityZone>().GravityVector;
___/*else
______Debug.Log ("GravityVector not found");*/ //Le else est là pour lever l'exception mais il n'est pas obligatoire
}
Egalement, par convention, les variables commencent par une minuscule.
"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
TheParadox
Messages : 84
Inscription : 12 Juil 2017 19:54
Localisation : France

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par TheParadox » 21 Juil 2017 16:28

Il est tout simple pour l'instant :

Code : Tout sélectionner

public class GravityZone : MonoBehaviour {

	public GameObject Repere ;
	public static Vector3 GravityVector;

	
	void Update () {
		GravityVector = this.transform.position - Repere.transform.position ;
	}
}
En fait c'est une plaque qui attire les objets à proximité vers elle. En gros, elle "change" de sens la gravité.
Le GameObject "Repere" est un transform placé au-dessus de la plaque.
Il sert uniquement à récupérer un vecteur.
Une seule chose est sûre : rien n'est certain, car cette phrase est un mensonge.

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

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par boubouk50 » 21 Juil 2017 16:46

Ta variable est statique. En as-tu l'utilité? Il faudrait pouvoir t'en proscrire, c'est pas bien les static, tout aussi pas bien que de mettre ses coudes sur la table. Disons que c'est une mauvaise pratique dont seuls les puristes t'en tiendront rigueur, mais au fond, c'est pas interdit par une quelconque convention ou constitution.
Static signifie en gros qu'elle est unique de partout et accessible à partir de la classe pas du script.
Soit tu enlèves le static soit tu l'appelles directement sans le GetComponent ()

Code : Tout sélectionner

void OnTriggerEnter (Collider collider) { GravityV = GravityZone.GravityVector; }
Du coup, pas forcément besoin de GravityV si GravityVector est unique et accessible n'importe où...
"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
TheParadox
Messages : 84
Inscription : 12 Juil 2017 19:54
Localisation : France

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par TheParadox » 21 Juil 2017 17:09

Code : Tout sélectionner

void OnTriggerEnter (Collider collider) { GravityV = GravityZone.GravityVector; }
C'est ce que j'avais fais à la base (avec un test de tag en plus, pour vérifier si l'objet en collision est bien une plaque de gravité).
Mais comme je voudrais placer plusieurs plaques dans la scène, je suis obligé de préciser avec quelle plaque l'objet est entré en collision.
Du coup j'ai pensé à récupérer la variable avec la fonction OnTriggerEnter.

Le problème avec ce code là, c'est que l'objet qui le possède récupèrera le même vecteur peu importe avec quelle plaque il entre en collision.
Alors que je voudrais que le vecteur dépende de la plaque près de laquelle il se trouve.

Mais comment récupérer une variable non-statique dans un autre script ?
Je croyais que c'était obligatoire.
Une seule chose est sûre : rien n'est certain, car cette phrase est un mensonge.

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

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par boubouk50 » 21 Juil 2017 17:26

Donc, tu enlèves le static déjà. Et ensuite, ben ensuite ton code précédent devrait fonctionner.

Par contre, je vois que ta variable GravityVector est mise à jour à chaque Update (), donc tu ne récupéreras que sa valeur à l'instant t de la collision. Il te faudrait donc pointer dessus si tu as besoin de sa valeur réelle à chaque frame, et là, on commence à sortir de mon cadre de compétences acquises, sinon pas de souci.
Tu pourrais utiliser OnTriggerStay () pour actualiser à chaque frame, tu pourrais récupérer le gameObject et son repère pour avoir accès à leur position et recalculer la gravité locale, sinon faudrait pointer dessus, mais je sais pas trop comment faire.
"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
TheParadox
Messages : 84
Inscription : 12 Juil 2017 19:54
Localisation : France

Re: [DB-Al] Récupérer un vector3 avec la fonction OnTriggerEnter() .

Message par TheParadox » 21 Juil 2017 17:30

C'est bon, ça fonctionne.

Merci ;-)
Une seule chose est sûre : rien n'est certain, car cette phrase est un mensonge.

Répondre

Revenir vers « (C#) CSharp »