[RESOLU][DB -AL]Probleme d'orientation

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
1300vrtical
Messages : 46
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

[RESOLU][DB -AL]Probleme d'orientation

Message par 1300vrtical » 11 Sep 2019 11:45

Bonjour,
depuis peu j'ai un problème sur mon projet qui est apparu de façon inopinée et que je n'arrive pas à me débarrasser.
Je suis sur la fin de mon projet et peut-être qu'un œil neuf :shock: m'aidera à y voir un peu mieux.
Lorsque j'appuie sur un bouton sur un canvas, mon cube tourne. Comme pour un dé, je récupère l'information de la face du haut, ce qui me permet de lancer une animation ainsi que de changer subtilement l'orientation de mon "plateau". Je change l'orientation de mon "plateau", pour l'avoir toujours du bon sens quel que soit le côté d'où il arrive.(ça m'aide grandement pour optimiser pas mal les éléments 3D que je ne voudrais qu'en 2D, et ça garde une cohérence visuelle).
Mais voilà, une des faces ne réagit plus. L'information indiquant sur quelle face elle est et toujours bonne, l'animation se lance toujours, mais seulement l'orientation ne fonctionne plus.
J'aimerais savoir s'il existe un moyen de debugger mon problème :
Est-ce qu'unity lit la ligne dans mon script qui me permet de faire ce changement d'orientation?
S'il la lit alors pourquoi ne l'excute t'il pas?
Mais s'il ne la lit pas, alors pourquoi est-ce qu'il y a un saut au niveau de cette ligne? Comment arranger ça?

Merci :merci: à tous ceux qui m'aideront à comprendre mon problème
Cordialement 1300VRTICAL

Code utilisé:
topFace

Code : Tout sélectionner

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

public class TopFace : MonoBehaviour
{

    public static int ChristianToScore;


    // Update is called once per frame
    void Update()
    {
        if(Vector3.Angle(this.transform.right, -Vector3.up) < 1)
        {ChristianToScore = 4;}

        else if(Vector3.Angle(this.transform.right, Vector3.up) < 1)
        {ChristianToScore = 3;}

        else if(Vector3.Angle(this.transform.up, Vector3.up) < 1)
        {ChristianToScore = 6;}

        else if(Vector3.Angle(this.transform.up, -Vector3.up) < 1)
        {ChristianToScore = 1;}

        else if(Vector3.Angle(this.transform.forward, Vector3.up) < 1)
        {ChristianToScore = 2;}

        else if(Vector3.Angle(this.transform.forward, -Vector3.up) < 1)
        {ChristianToScore = 5;}

        Debug.Log(ChristianToScore);
    }

}
et voici le code d'activation de la face:

Code : Tout sélectionner

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

public class Face6 : MonoBehaviour
{
public GameObject BalleJaune;
private bool enHaut;
private bool once = false;
private Animator _animator;
    void Start()
    {
        BalleJaune.GetComponent<Animation>().Stop("MondeDroit");
        BalleJaune.SetActiveRecursively(false);
    }

    void Update()
    {
        if (TopFace.ChristianToScore == 2 && !once)
        {
            BalleJaune.SetActiveRecursively(true);
            MonterBalle();
            Quaternion target = Quaternion.Euler(0, 180, 0);
            BalleJaune.transform.rotation = Quaternion.Slerp(transform.rotation, target,1);
        }
        else if(TopFace.ChristianToScore !=2 && once)
        {
            DescentBalle();
            StartCoroutine (TTimer());
        }

        
    }
    public void MonterBalle()
    {
        once = true;
        enHaut = true;
        BalleJaune.GetComponent<Animation>().Play("MondeDroit");
    }

    public void DescentBalle()
    {
        once = true;
        enHaut = true;
        BalleJaune.GetComponent<Animation>().Play("MondeDroitRR");
        once = false;
    }
   IEnumerator TTimer()
        {
        yield return new WaitForSeconds (0.3f);
        BalleJaune.SetActiveRecursively(false);
        }
}
on peut observer ici comment le cube Violet/Bleu ((?)je suis daltonien) d'un des plateaux revient toujours à la même place et comment le multicolore lui change de place en fonction de son point de départ.
https://vimeo.com/359252918
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5140
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB -AL]Probleme d'orientation

Message par boubouk50 » 11 Sep 2019 13:18

En soi, c'est un comportement normal. Prend un cube et tourne-le dans différente façon, tu ne retrouveras pas forcément le coin au même endroit, car les rotations sont interdépendantes.
Maintenant, si tu veux que la partie du dessus revienne tjs dans le même sens, alors il te faut réinitialiser sa rotation à chaque fois qu'elle se présente. Avant de la faire monter par ton animation ou autre, tu dois lui donner une rotation prédéfinie.
"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
1300vrtical
Messages : 46
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB -AL]Probleme d'orientation

Message par 1300vrtical » 11 Sep 2019 16:38

Merci de ta réponse,


Cependant, j'ai déjà ligne de script qui me permet de faire ça :
Quaternion target = Quaternion.Euler(0, 180, 0); BalleJaune.transform.rotation = Quaternion.Slerp(transform.rotation, target, 1);

C'est qu'il fonctionne pour toutes mes autres faces, seule une de mes faces bug et j'aimerais bien savoir pourquoi. Et quel moyen j'ai de savoir si cette ligne est lue.


Je me rends compte que Je n'ai pas expliqué dans mon code, via les commentaires, ce qu'il se passait.
TopFace me permet de savoir quelle est la face au dessus.

Code : Tout sélectionner

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

public class TopFace : MonoBehaviour
{

    public static int ChristianToScore; //comme le int des scrore (de 1 à 6) est static il peut etre facilement utilisé dans d'autre script.


    // Update is called once per frame
    void Update()
    {
        if(Vector3.Angle(this.transform.right, -Vector3.up) < 1)
        {ChristianToScore = 4;}

        else if(Vector3.Angle(this.transform.right, Vector3.up) < 1)
        {ChristianToScore = 3;}

        else if(Vector3.Angle(this.transform.up, Vector3.up) < 1)
        {ChristianToScore = 6;}

        else if(Vector3.Angle(this.transform.up, -Vector3.up) < 1)
        {ChristianToScore = 1;}

        else if(Vector3.Angle(this.transform.forward, Vector3.up) < 1)
        {ChristianToScore = 2;}// la face qui nous intéresse (MondeDroit)

        else if(Vector3.Angle(this.transform.forward, -Vector3.up) < 1)
        {ChristianToScore = 5;}

        Debug.Log(ChristianToScore);
    }

}
Face6 est pour activer, lancer l'animation et donner une rotation spécifique du plateau en fonction du TopFace.Il existe du coup 6 scripts: Face1, Face2, Face3, Face4, Face5 et Face6. Tous sont des copier-coller du même modèle. Ils auraient donc les mêmes propriétés. Seulement Face6 ne fonctionne pas entièrement: l'activation et l'animation fonctionne, mais pas la rotation. J'ai essayé de changer le Quaternion.Euler en donnant des chiffre fantaisiste, ça n'a rien fait.

Code : Tout sélectionner

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

public class Face6 : MonoBehaviour
{
public GameObject BalleJaune; //objet visé par le changement ( en l'occurrence : MondeDroit)
private bool enHaut;
private bool once = false;
private Animator _animator;
    void Start()
    {
        BalleJaune.GetComponent<Animation>().Stop("MondeDroit");//animation stopper au depart
        BalleJaune.SetActiveRecursively(false);
    }

    void Update()
    {
        if (TopFace.ChristianToScore == 2 && !once) // si la face 2 est en haut alors faire:
        {
            BalleJaune.SetActiveRecursively(true); //activation du plateaux (fonctionne) 
            MonterBalle();                                        //Animation vers le haut (fonctionne) 
            Quaternion target = Quaternion.Euler(0, 180, 0); // Nouvelle position enregistrée dans target 
            BalleJaune.transform.rotation = Quaternion.Slerp(transform.rotation, target, 1); //Réorientation du plateau grâce à target (ne fonctionne pas) 
        }
        else if(TopFace.ChristianToScore !=2 && once)
        {
            DescentBalle(); //animation de fin (fonctionne)
            StartCoroutine (TTimer());
        }

        
    }
    public void MonterBalle()//Fonction avec l'animation.
    {
        once = true;
        enHaut = true;
        BalleJaune.GetComponent<Animation>().Play("MondeDroit");
    }

    public void DescentBalle()
    {
        once = true;
        enHaut = true;
        BalleJaune.GetComponent<Animation>().Play("MondeDroitRR");
        once = false;
    }
   IEnumerator TTimer()
        {
        yield return new WaitForSeconds (0.3f);
        BalleJaune.SetActiveRecursively(false);
        }
}
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5140
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [DB -AL]Probleme d'orientation

Message par boubouk50 » 11 Sep 2019 17:10

Pour savoir si une ligne est lue, tu peux ajouter un Debug.Log () qui te donnera un message en console.
MAIS, une ligne n'est jamais sautée comme ça pouf pouf. Donc si celles d'avant sont effectuées, elle l'est aussi SAUF si une erreur apparaît, dans ce cas rien n'est interprété APRÈS l'erreur.
Donc (1) as-tu une erreur en console?
(2) Si elle est jouée, peut-être que transform.rotation vaut déjà target.
(3) ton Slerp n'a aucune utilité, il est joué sur une frame et le résultat sera toujours target. Donc tu peux remplacer cette ligne et la précédente par

Code : Tout sélectionner

BalleJaune.transform.rotation = Quaternion.Euler(0, 180, 0);
Aussi, jne vois que tu joues une animation sur BalleJaune en plus d'affecter la rotation. Attention, l'animation risque de supplanter l'affectation.
"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
1300vrtical
Messages : 46
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB -AL]Probleme d'orientation

Message par 1300vrtical » 11 Sep 2019 19:16

(1) as-tu une erreur en console?

Non aucune erreur n'est dit dans la console

(2) Si elle est jouée, peut-être que transform.rotation vaut déjà target.

montrasform.rotation ne vaut pas déjà ma target.

(3) ton Slerp n'a aucune utilité, il est joué sur une frame et le résultat sera toujours target. Donc tu peux remplacer cette ligne et la précédente par BalleJaune.transform.rotation = Quaternion.Euler(0, 180, 0);

j'ai retiré ce slerp, ça ne fonctionne toujours pas.Aussi, je vois que tu joues une animation sur BalleJaune en plus d'affecter la rotation. Attention, l'animation risque de supplanter l'affectation.

J'ai //retirer l'animation et là: ça a fonctionné! :merci: merci! :merci:

Je vais mettre l'animation sur un autre script et ça devrais marcher
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5140
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [RESOLU][DB -AL]Probleme d'orientation

Message par boubouk50 » 12 Sep 2019 09:16

Pense à passer ton sujet en [RESOLU] stp.
Merci.
"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 »