[RESOLU] Incompréhension Sur les mouvements des entités en 2d
-
fean-ahiru
- Messages : 4
- Inscription : 18 Fév 2026 13:31
[RESOLU] Incompréhension Sur les mouvements des entités en 2d
Bonjour,
Je suis actuellement en train d'essayer de dev un petit Shoot em up. Je fais donc des test de script pour avoir une certaines variété de mouvement pour les ennemis. Mais je me heurte à quelque chose que je ne comprend pas.
J'essaye de faire que mes ennemis se dirige vers un point précis, mais pour une raison que j'ignore, leur chemin est décalé...
J'ai testé en faisant :
transform.Translate(dirtest * Time.deltaTime * speed / 5 , Space.Self ); Ou ici :
transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);
(dirtest étant les coordonnées du point visé, représenté par un rond blanc sur les images. Le trajet Rouge est celui que fait le gobelin, le trajet en vert est celui que je voudrais qu'il fasse)
J'ai testé avec des points "cible" placé à differents endroit, mais je n'arrive pas à comprendre ce qu'il se passe. Est ce que j'ai loupé un truc ? Quelque chose dans les fonctionnement de movetoward et translate qui m'échappe ?
En vous remerciant par avance
Je suis actuellement en train d'essayer de dev un petit Shoot em up. Je fais donc des test de script pour avoir une certaines variété de mouvement pour les ennemis. Mais je me heurte à quelque chose que je ne comprend pas.
J'essaye de faire que mes ennemis se dirige vers un point précis, mais pour une raison que j'ignore, leur chemin est décalé...
J'ai testé en faisant :
transform.Translate(dirtest * Time.deltaTime * speed / 5 , Space.Self ); Ou ici :
transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);
(dirtest étant les coordonnées du point visé, représenté par un rond blanc sur les images. Le trajet Rouge est celui que fait le gobelin, le trajet en vert est celui que je voudrais qu'il fasse)
J'ai testé avec des points "cible" placé à differents endroit, mais je n'arrive pas à comprendre ce qu'il se passe. Est ce que j'ai loupé un truc ? Quelque chose dans les fonctionnement de movetoward et translate qui m'échappe ?
En vous remerciant par avance
- boubouk50
- ModoGenereux

- Messages : 6446
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Incompréhension Sur les mouvements des entités en 2d
Salut fean-ahiru,
Souvent le problème vient de la compréhension des vecteurs et des espaces.
Soit tu fais des déplacements dans l'espace local, soit dans l'espace global (world).
Dans les 2 cas, il faut que les vecteurs appartiennent tous au même espace. Ici, il est probable qu'un des vecteurs (dirtest) ne le soit pas.
Peux-tu donc nous donner l'affectation de dirtest stp ?
Pour Vector2.MoveTowards, dirtest devrait être la position world du point blanc, soit objectTest.transform.position.
Pour transform.Translate, dirtest doit être le vecteur de direction, soit (objectTest.transform.position - transform.position).normalized
Souvent le problème vient de la compréhension des vecteurs et des espaces.
Soit tu fais des déplacements dans l'espace local, soit dans l'espace global (world).
Dans les 2 cas, il faut que les vecteurs appartiennent tous au même espace. Ici, il est probable qu'un des vecteurs (dirtest) ne le soit pas.
Peux-tu donc nous donner l'affectation de dirtest stp ?
Pour Vector2.MoveTowards, dirtest devrait être la position world du point blanc, soit objectTest.transform.position.
Pour transform.Translate, dirtest doit être le vecteur de direction, soit (objectTest.transform.position - transform.position).normalized
"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
-
fean-ahiru
- Messages : 4
- Inscription : 18 Fév 2026 13:31
Re: Incompréhension Sur les mouvements des entités en 2d
Bonjour,
Merci pour ta réponse
Je ne suis pas sûr de comprendre le space. Tu parles des plans qui peuvent se superposer ?
Pour dirtest, j'écrit juste "dirtest = new Vector2(-5f, -8f);" au début de mon script. Il est là uniquement pour mes test (pareil pour le point blanc, je le fait apparaitre uniquement pour savoir ce qui cloche)
L'objectif final est de faire que le gobelin enregistre la position qu'à le joueur au moment de son apparition (l'apparition du gobelin) et qu'il aille dans cette direction ensuite, même si le joueur a bouger. (je ne veux pas faire qu'il soit a tête chercheuse non plus)
Dans mes premiers test, je faisais donc enregistrer la position du joueur dans le void start() du gobelin en tant que vecteur2 à utiliser plus tard. D'où mes tests avec un point fixe pour tenter de comprendre ce qui cloche.
Merci pour ta réponse
Je ne suis pas sûr de comprendre le space. Tu parles des plans qui peuvent se superposer ?
Pour dirtest, j'écrit juste "dirtest = new Vector2(-5f, -8f);" au début de mon script. Il est là uniquement pour mes test (pareil pour le point blanc, je le fait apparaitre uniquement pour savoir ce qui cloche)
L'objectif final est de faire que le gobelin enregistre la position qu'à le joueur au moment de son apparition (l'apparition du gobelin) et qu'il aille dans cette direction ensuite, même si le joueur a bouger. (je ne veux pas faire qu'il soit a tête chercheuse non plus)
Dans mes premiers test, je faisais donc enregistrer la position du joueur dans le void start() du gobelin en tant que vecteur2 à utiliser plus tard. D'où mes tests avec un point fixe pour tenter de comprendre ce qui cloche.
- boubouk50
- ModoGenereux

- Messages : 6446
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Incompréhension Sur les mouvements des entités en 2d
Dans Unity (et tous les autres moteurs), tu peux travailler dans différents espaces. Les 2 principaux sont l'espace local et l'espace global (World).
Espace global : Espace du monde. L'origine de cet espace est l'origine du monde et les axes de transformations sont fixés par le monde. Cet espace est fixe.
Espace local : Espace de l'objet. L'origine de cet espace est le pivot de l'objet. Les axes de transformation sont dépendants de la rotation de l'objet.
Pour faire un parallèle : tu es dans un train qui avance. Une personne qui est au bord des rails te voit dans le train. Tu te déplaces par rapport au monde. Il te voit dans l'espace global. Tu te diriges vers l'est.
De ton point de vue, tu ne te déplaces pas dans le train (tu es assis), et c'est le monde qui défile, et il défile vers l'ouest.
Du point de vue de l'observateur, tout est figé et tout le monde s'y retrouve : vitesse, direction, etc. Nous avons tous la même référence.
De ton point de vue, c'est plus compliqué pour quelqu'un d'autre de savoir exactement tout cela, car cela dépend de toi et du train.
Pour revenir à Unity, il faut que tu fasses un choix d'espace, parce que tu ne peux pas imbriquer les deux. Un vecteur dans un espace, ne vaut rien dans l'autre, sauf si l'objet local n'a subi aucune transformation (cas unique de superposition des espaces).
Quand tu écris new Vector2 (-5, -8), s'il est considéré dans l'espace global, il s'agit d'un vecteur qui fait 5 unités vers la gauche (-x) et 8 unités vers le bas (-y) par rapport à l'origine (0, 0). S'il est considéré dans l'espace local, il fait 5 unités sur l'axe local -x de l'objet (donc la gauche de l'objet) et 8 unités sur l'axe local -y de l'objet (vers le bas de l'objet) par rapport au pivot de l'objet.
Ceci dit :
transform.Translate() attend une direction et non pas une position : direction = (objetCible.transform.position - transform.position).normalized
MoveTowards semble correct, mais cela veut dire que ton objet ira vers le point (-5,-8) du monde.
Attention, dans l'inspecteur, les coordonnées sont locales et non pas globales !
Pour avoir la position globale, il faut que l'objet n'ait pas de parent (puisque c'est le cas particulier de la superposition des espaces)
Espace global : Espace du monde. L'origine de cet espace est l'origine du monde et les axes de transformations sont fixés par le monde. Cet espace est fixe.
Espace local : Espace de l'objet. L'origine de cet espace est le pivot de l'objet. Les axes de transformation sont dépendants de la rotation de l'objet.
Pour faire un parallèle : tu es dans un train qui avance. Une personne qui est au bord des rails te voit dans le train. Tu te déplaces par rapport au monde. Il te voit dans l'espace global. Tu te diriges vers l'est.
De ton point de vue, tu ne te déplaces pas dans le train (tu es assis), et c'est le monde qui défile, et il défile vers l'ouest.
Du point de vue de l'observateur, tout est figé et tout le monde s'y retrouve : vitesse, direction, etc. Nous avons tous la même référence.
De ton point de vue, c'est plus compliqué pour quelqu'un d'autre de savoir exactement tout cela, car cela dépend de toi et du train.
Pour revenir à Unity, il faut que tu fasses un choix d'espace, parce que tu ne peux pas imbriquer les deux. Un vecteur dans un espace, ne vaut rien dans l'autre, sauf si l'objet local n'a subi aucune transformation (cas unique de superposition des espaces).
Quand tu écris new Vector2 (-5, -8), s'il est considéré dans l'espace global, il s'agit d'un vecteur qui fait 5 unités vers la gauche (-x) et 8 unités vers le bas (-y) par rapport à l'origine (0, 0). S'il est considéré dans l'espace local, il fait 5 unités sur l'axe local -x de l'objet (donc la gauche de l'objet) et 8 unités sur l'axe local -y de l'objet (vers le bas de l'objet) par rapport au pivot de l'objet.
Ceci dit :
transform.Translate() attend une direction et non pas une position : direction = (objetCible.transform.position - transform.position).normalized
MoveTowards semble correct, mais cela veut dire que ton objet ira vers le point (-5,-8) du monde.
Attention, dans l'inspecteur, les coordonnées sont locales et non pas globales !
Pour avoir la position globale, il faut que l'objet n'ait pas de parent (puisque c'est le cas particulier de la superposition des espaces)
"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
-
fean-ahiru
- Messages : 4
- Inscription : 18 Fév 2026 13:31
Re: Incompréhension Sur les mouvements des entités en 2d
Je pense que je comprend. ça explique que mon point et le gobelin soit tout les deux marqués en -5,-8 sans pour autant être au même endroit sur l'écran.
Du coup il vaut mieux que je j'utilise "Movetowards", noté =)
Mais du coup je ne suis pas sûr de comprendre comment régler le soucis. A l'heure actuelle je fait tout spawn sans parent, donc normalement tout devrait être dans le World non ? (j'ai aussi vérifier sur le spawnmanager et le prefab était bien en 0,0 pour être sûr qu'il n'y ai pas de décalage, mais tout est bon)
Mon spawn manager donne ça
Le script attaché au gobelin donne ça :
Mon inspecteur ressemble à ça quand non lancé :
Et à ça quand le jeu est lancé (avec 3 gobelins spawn)
Pour moi il n'y a pas de notion de parent non ?
(Navré si je pose des questions sur des trucs évidents
)
Du coup il vaut mieux que je j'utilise "Movetowards", noté =)
Mais du coup je ne suis pas sûr de comprendre comment régler le soucis. A l'heure actuelle je fait tout spawn sans parent, donc normalement tout devrait être dans le World non ? (j'ai aussi vérifier sur le spawnmanager et le prefab était bien en 0,0 pour être sûr qu'il n'y ai pas de décalage, mais tout est bon)
Mon spawn manager donne ça
Code : Tout sélectionner
public class SpawnManager : MonoBehaviour
{
public int Rand;
[SerializeField]
public GameObject Enemyprefab;
public GameObject Enemyprefab2;
public GameObject EntityHold;
// Start is called before the first frame update
void Start()
{
Rand = 1;
StartCoroutine(SpawnRoutine());
}
// Update is called once per frame
void Update()
{
}
public IEnumerator SpawnRoutine()
{
while (true) {
Vector3 posToSpawn = new Vector3(Random.Range(-6.3f, 6.3f), 6, 0);
// Rand pour savoir quel ennemi on fait spawn
Rand = Random.Range(0, 2);
switch(Rand)
{
case 0:
Instantiate(Enemyprefab, posToSpawn, Quaternion.identity);
break;
case 1:
//C'est cet ennemi qui pose soucis
Instantiate(Enemyprefab2, posToSpawn, Quaternion.identity);
//Instantiate(Enemyprefab2, posToSpawn, Quaternion.identity, EntityHold.transform);
break;
}
yield return new WaitForSeconds(1.0f);
}
}
Code : Tout sélectionner
public class Ennemy2 : MonoBehaviour
{
public float speed = 5.0f;
public float timer = -1f;
public int life = 4;
public Transform Target;
public Vector3 Targ;
public Vector2 dirtest;
[SerializeField]
GameObject Marqueur;
// Start is called before the first frame update
void Start()
{
dirtest = new Vector2(-5f, -8f);
timer = Time.time;
print("je spawn en x = " + dirtest.x + " et y = " + dirtest.y);
//Instantiate(Marqueur, dirtest, Quaternion.identity);
}
// Update is called once per frame
void Update()
{
mov2();
if (life <= 0)
{
Destroy(this.gameObject);
}
}
void mov2()
{
transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);
}
}
(Navré si je pose des questions sur des trucs évidents
- boubouk50
- ModoGenereux

- Messages : 6446
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Incompréhension Sur les mouvements des entités en 2d
De ce que je vois, tes ennemis sont instanciés sans parents définis, donc ils sont libres.
Cette ligne va donc déplacer ton gobelin vers dirtest (-5, -8) donc ils devraient tous se diriger vers ce point, donc pas tous dans la même direction)
CEPENDANT
direst est public, c'est-à-dire qu'il peut être affecté depuis l'inspecteur. Regarde donc dans ton prefab, si le script ennemy2 qui est attaché a bien les valeurs (-5, -8) pour dirtest.
AUSSI
Si un autre script est sur ton gobelin et que ce script lui fait faire d'autres déplacements, alors leurs déplacements pourraient être supplantés ou additionnés.
Code : Tout sélectionner
transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);CEPENDANT
direst est public, c'est-à-dire qu'il peut être affecté depuis l'inspecteur. Regarde donc dans ton prefab, si le script ennemy2 qui est attaché a bien les valeurs (-5, -8) pour dirtest.
AUSSI
Si un autre script est sur ton gobelin et que ce script lui fait faire d'autres déplacements, alors leurs déplacements pourraient être supplantés ou additionnés.
"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
-
fean-ahiru
- Messages : 4
- Inscription : 18 Fév 2026 13:31
Re: Incompréhension Sur les mouvements des entités en 2d
PAR FECA ! J'ai trouvé d'où venait le soucis. Le pivot de mes sprites était décalé (x:0 et y:1) et ça décalait complètement leur position dans le world. J'ai juste remis en "Pivot center" (x:0.5,y:0.5) et le tout est recalé.
Merci pour m'avoir expliqué le fonctionnement de l'espace dans le moteur. J'aurais pu tourner encore longtemps sans ça =)
Merci pour m'avoir expliqué le fonctionnement de l'espace dans le moteur. J'aurais pu tourner encore longtemps sans ça =)
- boubouk50
- ModoGenereux

- Messages : 6446
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Incompréhension Sur les mouvements des entités en 2d
Mince, j'y avais pensé en plus ! Le coup du pivot pas centré est un classique
Lorsqu'un problème est résolu, nous avons pour règle d'éditer le titre du premier message et ajouter [RESOLU] en début de celui-ci pour signaler aux autres membres que la solution a été trouvée. Je m'en occupe cette fois-ci
Bon dev
Lorsqu'un problème est résolu, nous avons pour règle d'éditer le titre du premier message et ajouter [RESOLU] en début de celui-ci pour signaler aux autres membres que la solution a été trouvée. Je m'en occupe cette fois-ci
Bon dev
"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