[RESOLU] Incompréhension Sur les mouvements des entités en 2d

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
fean-ahiru
Messages : 4
Inscription : 18 Fév 2026 13:31

[RESOLU] Incompréhension Sur les mouvements des entités en 2d

Message par fean-ahiru » 19 Fév 2026 17:05

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 );
pbpath.png
pbpath.png (32.2 Kio) Consulté 2652 fois
pbpath2.png
pbpath2.png (19.34 Kio) Consulté 2652 fois
Ou ici :
transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);
pbpath3.png
pbpath3.png (13.59 Kio) Consulté 2652 fois
(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

Avatar de l’utilisateur
boubouk50
ModoGenereux
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

Message par boubouk50 » 20 Fév 2026 09:51

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
"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

fean-ahiru
Messages : 4
Inscription : 18 Fév 2026 13:31

Re: Incompréhension Sur les mouvements des entités en 2d

Message par fean-ahiru » 23 Fév 2026 21:31

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.

Avatar de l’utilisateur
boubouk50
ModoGenereux
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

Message par boubouk50 » 24 Fév 2026 10:57

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)
"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

fean-ahiru
Messages : 4
Inscription : 18 Fév 2026 13:31

Re: Incompréhension Sur les mouvements des entités en 2d

Message par fean-ahiru » 24 Fév 2026 15:56

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

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);
        }
    }
Le script attaché au gobelin donne ça :

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);
}
}
Mon inspecteur ressemble à ça quand non lancé :
inspect1.png
inspect1.png (42.31 Kio) Consulté 2297 fois
Et à ça quand le jeu est lancé (avec 3 gobelins spawn)
inspect2.png
inspect2.png (51.47 Kio) Consulté 2297 fois
Pour moi il n'y a pas de notion de parent non ?

(Navré si je pose des questions sur des trucs évidents :/ )

Avatar de l’utilisateur
boubouk50
ModoGenereux
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

Message par boubouk50 » 24 Fév 2026 16:38

De ce que je vois, tes ennemis sont instanciés sans parents définis, donc ils sont libres.

Code : Tout sélectionner

transform.position = Vector2.MoveTowards(transform.position, dirtest, speed * Time.deltaTime);
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.
"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

fean-ahiru
Messages : 4
Inscription : 18 Fév 2026 13:31

Re: Incompréhension Sur les mouvements des entités en 2d

Message par fean-ahiru » 28 Fév 2026 21:02

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 =)

Avatar de l’utilisateur
boubouk50
ModoGenereux
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

Message par boubouk50 » 02 Mars 2026 11:13

Mince, j'y avais pensé en plus ! Le coup du pivot pas centré est un classique :super:

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

Répondre

Revenir vers « Unity le logiciel »