Un comportement que je ne comprend pas

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Un comportement que je ne comprend pas

Message par DJ-OMZ » 09 Déc 2018 18:11

Bonjour,
Je vais essayer d'expliquer simplement :

J'ai un objet "tileMap", qui a tout un tas de fonctions.

Dans tileMap, j'ai une référence a un autre objet "torus" qui lui, déclenche une anim quand son booléen est vrai. J'ai aussi une fonction en particulier, qui est appelée par 2 différents types d'objets, et qui va changer la valeur du booléen de "torus".

Dans un de mes objets, j'appelle la fonction de tileMap, la fonction fait son boulot, change le booléen de torus, et tout le monde est content.
Dans un autre objet, j'appelle la fonction exactement de la même manière, la fonction fait son boulot MAIS j'ai pas mon anim de déclenchée... Alors j'ai placé un debug.log dans la fonction et je constate que le booléen change bien de valeur, mais je n'ai pas mon anim...
Dans le update de torus, j'ai mis un debug.log si le bool est vrai, mais je n'ai pas de résultat, donc il ne passe jamais a vrai...

Je ne comprends vraiment pas, il n'y a aucune différence... Qu'est-ce qui pourrait causer cela ?

Un détail, la fonction ne fait pas que changer le bool, elle change aussi la position, et dans le "faux" résultat, la position est bien modifiée comme il faut, il n'y a que le booléen qui n'est pas mis a jour...

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Un comportement que je ne comprend pas

Message par Max » 09 Déc 2018 22:04

Bonsoir,

tu parles beaucoup de Debug, bool,, de fonctions, etc...
Cela serait bien de poster la partie script, je pense que cela aiderait certainement à une meilleurs compréhension de ton soucis.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Un comportement que je ne comprend pas

Message par DJ-OMZ » 10 Déc 2018 10:42

Max a écrit :
09 Déc 2018 22:04
Bonsoir,

tu parles beaucoup de Debug, bool,, de fonctions, etc...
Cela serait bien de poster la partie script, je pense que cela aiderait certainement à une meilleurs compréhension de ton soucis.
J'ai volontairement évité car c'est le bazar, voyez plutôt :

Tilemap :

Code : Tout sélectionner

public void GeneratePathTo(int x, int z)
    {
        if (selectedUnit.GetComponent<Unit>().arrivee)
        {
            selectedUnit.GetComponent<Unit>().currentPath = null;
            //Algo de Dijkstra
            Dictionary<Node, float> dist = new Dictionary<Node, float>();
            Dictionary<Node, Node> prev = new Dictionary<Node, Node>();

            List<Node> unvisited = new List<Node>();

            Node source = graph[selectedUnit.GetComponent<Unit>().tileX, selectedUnit.GetComponent<Unit>().tileZ];
            Node target = graph[x, z];
            dist[source] = 0;
            prev[source] = null;

            foreach (Node v in graph)
            {
                if (v != source)
                {
                    dist[v] = Mathf.Infinity;
                    prev[v] = null;
                }
                unvisited.Add(v);
            }
            while (unvisited.Count > 0)
            {
                Node u = null;
                foreach (Node possibleU in unvisited)
                {
                    if (u == null || dist[possibleU] < dist[u])
                    {
                        u = possibleU;
                    }
                }
                if (u == target)
                {
                    break;
                }
                unvisited.Remove(u);

                foreach (Node v in u.voisins)
                {
                    float alt = dist[u] + CostToEnterTile(v.x, v.z);
                    if (alt < dist[v])
                    {
                        dist[v] = alt;
                        prev[v] = u;
                    }
                }
            }
            //We found shortest path or no road at all
            if (prev[target] == null)
            {
                //No route
                FindObjectOfType<GoNoGo>().Play("NoGo");
                torus.animate = true;
                torus.transform.position = new Vector3(x, tiles[x,z]["Niveau"], z);
                torus.rend.material = torus.rouge;
                //Debug.Log("No route to "+x+z);
            }
            else
            {
                FindObjectOfType<GoNoGo>().Play("Go");
                torus.transform.position = new Vector3(x, tiles[x, z]["Niveau"], z);
                torus.rend.material = torus.blanc;
                torus.animate = true;
                List<Node> currentPath = new List<Node>();
                Node curr = target;
                while (curr != null)
                {
                    currentPath.Add(curr);
                    curr = prev[curr];
                }
                currentPath.Reverse();
                selectedUnit.GetComponent<Unit>().currentPath = currentPath;
            }
        }
Il y a tout un micmac, la partie qui nous interesse est ici :

Code : Tout sélectionner

if (prev[target] == null)
            {
                //No route
                FindObjectOfType<GoNoGo>().Play("NoGo");
                torus.animate = true;
                torus.transform.position = new Vector3(x, tiles[x,z]["Niveau"], z);
                torus.rend.material = torus.rouge;
                //Debug.Log("No route to "+x+z);
            }
            else
            {
                FindObjectOfType<GoNoGo>().Play("Go");
                torus.transform.position = new Vector3(x, tiles[x, z]["Niveau"], z);
                torus.rend.material = torus.blanc;
                torus.animate = true;
                List<Node> currentPath = new List<Node>();
                Node curr = target;
                while (curr != null)
                {
                    currentPath.Add(curr);
                    curr = prev[curr];
                }
                currentPath.Reverse();
                selectedUnit.GetComponent<Unit>().currentPath = currentPath;
            }
ClickableTile :

Code : Tout sélectionner

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

public class ClickableTile : MonoBehaviour {
    public int tileX;
    public int tileY;
    public int tileZ;
    public TileMap map;

	void OnMouseUp() {
        map.GeneratePathTo(tileX, tileZ);
	}
}
Ici, le résultat fonctionne parfaitement.

ClickableObjectPushPillar, enfant de ClickableObject

Code : Tout sélectionner

new void PillarAction(int x, int y, int z)
    {
        int unitX = map.selectedUnit.GetComponent<Unit>().tileX;
        int unitZ = map.selectedUnit.GetComponent<Unit>().tileZ;
        int niveauDepart = map.tiles[x, z]["Niveau"];
        if (map.tiles[unitX, unitZ]["Niveau"] == niveauDepart)
        {
            map.GeneratePathTo(x, z);
        }
        else
        {
            if (map.CheckIsVoisin(unitX, map.tiles[unitX, unitZ]["Niveau"], unitZ, x, y, z))
            {
                nextX = BehindObject(unitX, unitZ, x, z);
                nextZ = BehindObject(unitZ, unitX, z, x);
                if (CheckPushValid(nextX, nextZ, y))
                {
                    FindObjectOfType<GoNoGo>().Play("Rock");
                    map.selectedUnit.GetComponent<Unit>().arrivee = false;
                    map.selectedUnit.GetComponent<Unit>().push = true;
                    pillarPosition = transform.position;
                    pushPillar = true;
                }
                else
                {
                    map.selectedUnit.GetComponent<Unit>().arrivee = true;
                    map.GeneratePathTo(x, z);
                }
            }
            else
            {
                map.selectedUnit.GetComponent<Unit>().arrivee = true;
                map.GeneratePathTo(x, z);
            }
        }
    }
J'ai mis la fonction qui appelle GeneratePathTo de l'objet Tilemap, dans laquelle il y a le changement du booléen.
Et ici, rien, le booléen de l'objet Torus n'est pas updaté...
Pourtant, quand apres la ligne "torus.animate = true", j'ajoute un debug, je le vois bien a true, mais dans l'objet Torus, il reste faux...

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Un comportement que je ne comprend pas

Message par DJ-OMZ » 10 Déc 2018 17:10

Je ne comprends pas, j'ai fait tous les tests de la terre, rien...

Il n'y a aucun endroit dans mon code ou le booléen repasse a faux, et pourtant, quand je le passe a vrai, il reste faux.
Si je passe par l'objet ClickableTile pour appeler la fonction de Tilemap, tout passe, mais si je passe par l'objet ClickableObjectPushPillar, alors le booléen n'est pas updaté.

Je n'ai aucune explication a cela, je crois même que c'est un bug... Si quelqu'un aurait la moindre idée, je suis preneur, car ma solution actuellement est de laisser tomber, il n'y a rien de logique dans ce comportement... J'ai même tenté de le changer directement dans ClickableObjectPushPillar, sans faire appel a la fonction de Tilemap, et toujours rien.
Si dans ClickableObjectPushPillar, je fais un check, je vois que le booléen est vrai, et pourtant dans l'objet Torus, il est bien faux... Mystère et boule de gomme.

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

Re: Un comportement que je ne comprend pas

Message par boubouk50 » 10 Déc 2018 17:27

Est-ce juste bien la bonne référence?
Je veux dire que dans ton objet enfant, quand il appelle GeneratePathTo () de la variable map, est-ce bien sur le bon objet qu'il est appelé?
Il n'y a pas d'erreur en console qui arrêterait le script avant que la variable de Torus ne soit affectée?
"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
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Un comportement que je ne comprend pas

Message par DJ-OMZ » 10 Déc 2018 19:40

boubouk50 a écrit :
10 Déc 2018 17:27
Est-ce juste bien la bonne référence?
Je veux dire que dans ton objet enfant, quand il appelle GeneratePathTo () de la variable map, est-ce bien sur le bon objet qu'il est appelé?
Il n'y a pas d'erreur en console qui arrêterait le script avant que la variable de Torus ne soit affectée?
Je n'ai qu'un seul objet tileMap, donc c'est bien le bon. De plus, en plus de changer le booléen de Torus, je change également sa position, et la position est bien mise a jour ! :snif:

Au niveau de la console je n'ai pas d'erreur...

Répondre

Revenir vers « Scripting »