la prise de la composante transform.rotation ne fonctionne pas au moment voulu

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 : 342
Inscription : 10 Août 2016 03:03

la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par Kaloverian » 02 Avr 2020 16:03

bonjour,

Voici mon léger problème simple:
Dans ce script C#,dès que j'appuie sur une touche, j'instancie dynamiquement un objet B sur un objet A auparavant en rotation continue ou non..
Cet objet B est dévié par rapport à A d'un angle constant.
Cette déviation à angle constant fonctionne quand l'objet A n'est pas en rotation continue sur lui-même.
Ça foire dès qu'au moment où A est ou à subi une rotation continue sur lui-même.
Pourtant, après chaque instanciation dynamique,,l'objet instancié prend la composante de transform.rotation de l'objet A.
Où est le problème?

voici le code simple représentant le problème:

Code : Tout sélectionner

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



public class probleme : MonoBehaviour
{
	public KeyCode droite;
	public KeyCode accélerer;
	public KeyCode vitesse_const;
	public KeyCode stop_rotation;
	public float vitesse_angulaire, accéleration_angulaire, angle_deviation,vitesse_trans;
	public GameObject objetA, objetB;
	float tr = 0;
	int k = 0;
	List<GameObject> ObjectList;


	// Use this for initialization
	void Start()
	{
		ObjectList = new List<GameObject>();
		ObjectList.Add(objetA);
		k++; // on incrément k car maintentant la liste a un élément, K représente le nombre d'élément dans la liste
	}

	// Update is called once per frame
	void Update()
	{

		if (Input.GetKeyDown(droite))
		{

			// k etant le nombre d'élémént dans la liste, k-1 représente l'index de ce dernier élément.
			ObjectList.Add(Instantiate(ObjectList[k-1])); // duplique le dernier élément présent dans la liste, et l'ajoute à la liste. sa position/rotation/scale... sont identique à l'élément précédent.
			// vu qu'on a ajouter un élément a la liste, et que k n'est pas encore incrémenté, k deviens l'index du dernier élément de  la liste.
			ObjectList[k].name = "objet" + k; //définie le nom du dernier GameObject de la liste.

			ObjectList[k].transform.Rotate(0, angle_deviation, 0, Space.Self);//permet la déviation de l'objet B par rapport 
			k++; // incrément k, car on a ajouter un élément à la liste. k redeviens le nombre d'élément dans la liste, et donc l'index du dernier élément est k-1
		}//fin de if 


		if (Input.GetKey(accélerer))
		{
			tr += accéleration_angulaire;
		}


		if (Input.GetKeyDown(vitesse_const))
		{
			tr = vitesse_angulaire;
		}

		if (Input.GetKeyDown(stop_rotation))
		{
			tr = 0;//stoppe la rotation continue	
		}
		// ici k-1 car k = nombre d'élément dans la liste, donc le dernier élément est k-1
		ObjectList[0].transform.Rotate(0, 0, tr, Space.Self);//rotation continue sur l’axe local Z en fonction des précédents
        ObjectList[k-1].transform.Translate(0, 0,vitesse_trans, Space.Self);

        
															 //appuis

	}//fin de Update()
}//fin de Class
 ! Message de : boubouk50
Merci de fournir un code, pas un chiffon
Dernière édition par Kaloverian le 03 Avr 2020 03:45, édité 12 fois.

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par djulio74 » 02 Avr 2020 16:42

Heu.. quand tu poste un code, assure toi qu'il est fonctionnel qu'on puisse nous même le copier coller pour voir les soucis.. :shock:

En l'état, excuse moi de te dire ça mais ce code c'est du grand n'importe quoi.
Dans le désordre, les variable non déclarées, des parenthèses et accolades manquantes à tout va ou mauvaise place , des point virgules qui se baladent, des virgule en trop.. etc (liste non exhaustive)

Fait quand même un effort s'il te plait.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par Kaloverian » 02 Avr 2020 17:40

effectivement...
Je viens de corriger mon code
désolé

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par boubouk50 » 02 Avr 2020 18:30

Déjà avant toute chose:
!! PAS DE CARACTERES SPECIAUX DANS LES NOMS DE VARIABLES ET FONCTIONS !!
"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: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par djulio74 » 02 Avr 2020 18:49

En effet c'est mieux ainsi.
Pour commencer, tu fais les même erreurs que ce que je t’ai déjà corrigé sur un autre post concernant les liste, dont tu n'as toujours pas compris le fonctionnement apparemment.


Code : Tout sélectionner

if (Input.GetKeyDown(droite))
{
	k++;
	ObjectList.Add(objetA);
	ObjectList[k] = new GameObject("objet" + k);//instanciation dynamique de l'objet B
	ObjectList[k].transform.rotation = ObjectList[k - 1].transform.rotation;//prend la composante de rotation de l'objet A
	ObjectList[k].transform.Rotate(0, angle_deviation, 0, Space.Self);//permet la déviation de l'objet B par rapport 
														//à l'objet A
}
Rien que ici rien ne vas.
Au Start, ta liste contien l'objectA, c'est bien. donc ObjectList[0] = ObjectA.
Ensuite, au premier appui sur droite tu ajoute de nouveau à ta liste ce même ObjectA (le même pas un doublon) donc ObjectList[1] = ObjectA. Ensuite du change ObjectList[1] par un nouveau GameObject vide. il faut plutot innstanciér :

Code : Tout sélectionner

ObjectList.Add(Instantiate(objetA)); // duplique l'objectA et le reférencie dans la liste
Seulement ensuite tu peux assigner K comme étant l'index du dernier élément de la liste

Code : Tout sélectionner

k = ObjectList.Count - 1; // assigne k au dernier index de la liste. La liste a 2 élément, k = 1, le deuxieme élément
Tu peut assigner un nom au gameobject correspondant au dernier élément que tu à ajouter à la liste :

Code : Tout sélectionner

ObjectList[k].name = "objet" + k; //définie le nom du dernier GameObject de la liste.

Code : Tout sélectionner

ObjectList[k].transform.Rotate(0, angle_deviation, 0, Space.Self);//permet la déviation de l'objet B par rapport 
Ici rien ne renvoi a ObjectB, donc pas compris. de plus cette ligne est inutile étant donné qu'avec l'instanciation, on a deja récupéré la position et la rotation de l'élément précédent.
ta premiere condition deviens, corrigée :

Code : Tout sélectionner

if (Input.GetKeyDown(droite))


	// k etant le nombre d'élémént dans la liste, k-1 représente l'index de ce dernier élément.
	ObjectList.Add(Instantiate(ObjectList[k-1])); // duplique le dernier élément présent dans la liste, et l'ajoute à la liste. sa position/rotation/scale... sont identique à l'élément précédent.
	// vu qu'on a ajouter un élément a la liste, et que k n'est pas encore incrémenté, k deviens l'index du dernier élément de  la liste.
	ObjectList[k].name = "objet" + k; //définie le nom du dernier GameObject de la liste.

	ObjectList[k].transform.Rotate(0, angle_deviation, 0, Space.Self);//permet la déviation de l'objet B par rapport 
	k++; // incrément k, car on a ajouter un élément à la liste.//à l'objet A

}//fin de if 
en faisant attention à la fin de ton update de remplacer k par k-1 :
script complet :

Code : Tout sélectionner

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



public class probleme : MonoBehaviour
{
	public KeyCode droite;
	public KeyCode accélerer;
	public KeyCode vitesse_const;
	public KeyCode stop_rotation;
	public float vitesse_angulaire, accéleration_angulaire, angle_deviation;
	public GameObject objetA, objetB;
	float tr = 0;
	int k = 0;
	List<GameObject> ObjectList;


	// Use this for initialization
	void Start()
	{
		ObjectList = new List<GameObject>();
		ObjectList.Add(objetA);
		k++; // on incrément k car maintentant la liste a un élément, K représente le nombre d'élément dans la liste
	}

	// Update is called once per frame
	void Update()
	{

		if (Input.GetKeyDown(droite))
		{

			// k etant le nombre d'élémént dans la liste, k-1 représente l'index de ce dernier élément.
			ObjectList.Add(Instantiate(ObjectList[k-1])); // duplique le dernier élément présent dans la liste, et l'ajoute à la liste. sa position/rotation/scale... sont identique à l'élément précédent.
			// vu qu'on a ajouter un élément a la liste, et que k n'est pas encore incrémenté, k deviens l'index du dernier élément de  la liste.
			ObjectList[k].name = "objet" + k; //définie le nom du dernier GameObject de la liste.

			ObjectList[k].transform.Rotate(0, angle_deviation, 0, Space.Self);//permet la déviation de l'objet B par rapport 
			k++; // incrément k, car on a ajouter un élément à la liste. k redeviens le nombre d'élément dans la liste, et donc l'index du dernier élément est k-1
		}//fin de if 


		if (Input.GetKey(accélerer))
		{
			tr += accéleration_angulaire;
		}


		if (Input.GetKeyDown(vitesse_const))
		{
			tr = vitesse_angulaire;
		}

		if (Input.GetKeyDown(stop_rotation))
		{
			tr = 0;//stoppe la rotation continue	
		}
		// ici k-1 car k = nombre d'élément dans la liste, donc le dernier élément est k-1
		ObjectList[k-1].transform.Rotate(0, 0, tr, Space.Self);//rotation continue sur l’axe local Z en fonction des précédents 
															 //appuis

	}//fin de Update()
}//fin de Class
voila par rapport a ce que j'ai compris de ton script. par contre tu as des probleme je pense dans tes rotate, d'axe de rotation. un coup tu tourne sur l'axe Y en localspace, et ensuite sur l'axe z.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par djulio74 » 02 Avr 2020 18:50

Par contre évite d'éditer a tout vas tes post, je prend pas mal de temps à t'expliquer, la je reviens au début et tu change encore des trucs, tout aussi dans l'erreur que le reste....
Tu as édité ton poste 9 fois!!!

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par Kaloverian » 02 Avr 2020 21:25

après l'étude de mon code corrigé,,j'ai remarqué que le problème de ma question initiale ne se pose pas.

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par djulio74 » 02 Avr 2020 21:54

Si ton problème est résolu, hésite pas à partager le code final si ça peut en aider d'autre.
Et passer le sujet en RÉSOLU. :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par Kaloverian » 03 Avr 2020 04:06

en fait non,le problème est résolu mais j'ai découvert un autre problème.
d'après mon code initial auquel s'ajoute une translation,je constate que lorsque l'objet A subit une rotation continue d'angle U_z(par la rotation à la fin en dehors du if),l'objet B ,dévié par la rotation d'angle V_y du if ,est translaté depuis l'objet A (qui a tourné auparavant sur l'axe Z) avec un mauvais repère local de B qui est de la forme(U,V,0) au lieu de (0,V,U).
La composante X dur repère local de B prend la composante Z du repère local de A alors que, pour les 2 objets A et B, la composante de X de leur repère local doit toujours être nulle(il ne faut pas que B plonge ou s'élève d'un angle U si A penche latéralement auparavant d'un angle U)
Il faut que B penche latéralement d'un angle U et tourne d'un angle V après que A soit penché latéralement d'un angle U
D'où vient le problème?

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

Re: la prise de la composante transform.rotation ne fonctionne pas au moment voulu

Message par djulio74 » 03 Avr 2020 07:49

En l'état pas facile d'aider,
Explique nous concrètement ce que tu cherche à faire, quel est le but dans ton jeux ?
Après avoir parcouru tes autre sujet de question, je dirais que c'est en relation avec ton histoire de tir dupliqué, Nan ? Ou du moins ça s'en rapproche.
Si c'est le cas dit moi, je t'expliquerai la démarche pour y arriver.
Si c'est pas le cas, alors donne plus d'information

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »