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...
Un comportement que je ne comprend pas
Re: Un comportement que je ne comprend pas
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.
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.
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
Re: Un comportement que je ne comprend pas
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;
}
}
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;
}
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);
}
}
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);
}
}
}
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...
Re: Un comportement que je ne comprend pas
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.
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.
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Un comportement que je ne comprend pas
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 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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Un comportement que je ne comprend pas
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 !boubouk50 a écrit : ↑10 Déc 2018 17:27Est-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?
Au niveau de la console je n'ai pas d'erreur...