Vector3.MoveTowards et lerp se deplacent instantanément

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
le44
Messages : 28
Inscription : 21 Oct 2020 15:15

Vector3.MoveTowards et lerp se deplacent instantanément

Message par le44 » 13 Déc 2020 12:05

Salut tout le monde!
J'essaie de faire un système de grenade qui fait un Lerp ou MoveTowards pour aller proggressuvement a la position cliquée.
Sauf que ca le fait instantanément et l'argument 3 est toujours la distance max pour moi pas les steps voici mon code vous remarquez quelque chose?:

Code : Tout sélectionner

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

public class greandrdo : MonoBehaviour
{

    public GameObject gren;
    public Transform p;
    public Vector3 mp;
    

    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            
            
            gren.transform.position = Vector3.MoveTowards(p.position,mp, 5 * Time.deltaTime);

        }
           
           mp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mp.z = -9;
        
        

    }  

}
Merci d'avance!Je tient a rapeller que je suis débutant

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

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par Max » 13 Déc 2020 13:14

Bonjour,

plusieurs choses.
La première, attention dans l'utilisation de ScreenToWorldPoint, il te faut fournir un composant z comme le dit la doc
(A screen space position (often mouse x, y), plus a z position for depth (for example, a camera clipping plane).)
Là ton retour (mp)ne doit pas vraiment correspondre à ce que tu attends, tu dois bien le voir au niveau de l'inspector.
Seconde chose, GetMouseButtonDown() prend en compte l'action uniquement au moment où tu presse le bouton. Donc ce qui se trouve dans ta condition ne sera exécuté qu'une fois (une frame). Il faut que l'appui sur le bouton de la souris déclanche l'action de déplacement (utilisation par exemple d'un boolean).
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

le44
Messages : 28
Inscription : 21 Oct 2020 15:15

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par le44 » 13 Déc 2020 15:32

Salut Max!
C'est bon j'ai appliqué une de tes modifications en mettant un booléen et aussi en mettant a true le booléen en cliquant puis a la fin du MoveToward je le met a false mais le probléme persiste car la grenade 2d va instantanément a la position du clic
et que le 3éme paramètre de movetowards est la distance max plutot que la vitesse voici mon script et merci beaucoup pour l'aide!

Code : Tout sélectionner

using UnityEngine;

public class greandrdo : MonoBehaviour
{

    public GameObject gren;
    public Transform p;
    public Vector3 mp;
    public bool deplace = false;//booléen qui definit si on peut se déplacer
    

    void Update()
    {
        mp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mp.z = -9;

        if (Input.GetMouseButtonDown(0))
        {

            deplace = true;//quand on clique on le met a true
            

        }
        if(deplace == true)//si c'est true alors faire Vector3.MoveTowards
        {
            gren.transform.position = Vector3.MoveTowards(p.position, mp, 10 * Time.deltaTime );//ici je ne comprends pas pourquoi le 1 * deltatime avence instatanément
            deplace = false;
        }

    }  

}

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

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par Max » 13 Déc 2020 15:55

déjà le deplace = false; dans la condition if(deplace == true) c'est forcément pas bon. Là aussi, tu va entrer dans la condition que tu va inhiber de suite par ton deplace = false;.
Il faut reprendre la logique de base, sur les boucle et les conditions. Ta condition if(deplace == true) doit rester vraie (true) tant que ta grenade n'a pas atteint son objectif. Seulement après tu peux la repasser à false.
Quand à la ligne

Code : Tout sélectionner

gren.transform.position = Vector3.MoveTowards(p.position, mp, 10 * Time.deltaTime );
elle ne sert pas à grand chose en l'état.
Tu devrais écrire plutôt quelque chose comme

Code : Tout sélectionner

gren.transform.position = Vector3.MoveTowards(gren.transform.position, mp, speed * Time.deltaTime);
Il faut que tu retravailles les bases logiques niveau code, c'est surtout là que tu a encore de grosse lacunes ;)
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

le44
Messages : 28
Inscription : 21 Oct 2020 15:15

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par le44 » 14 Déc 2020 14:10

Salut max!
Merci pour ts propositions mais jai quelques questions.
Ayant crée une nouvelle varaiable speed, je me demande pourquoi on ferait une nouvelle variable alors quon peut mettre un chiffre quon veut?
J'ai aussi mit une condition au cas ou le MoveTowards ne serait pas a la position du curseur
re-voici le code:

Code : Tout sélectionner

using UnityEngine;

public class greandrdo : MonoBehaviour
{

    public GameObject gren;
    public Transform p;
    public Vector3 mp;
    public bool deplace = false;//booléen qui definit si on peut se déplacer
    

    void Update()
    {
        mp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mp.z = -9;

        if (Input.GetMouseButtonUp(0))
        {

            deplace = true;//quand on clique on le met a true
            

        }
        if(deplace == true)//si c'est true alors faire Vector3.MoveTowards
        {
            
            gren.transform.position = Vector3.MoveTowards(p.position, mp, 10 * Time.deltaTime );//ici je ne comprends pas pourquoi le 1 * deltatime avence instatanément
            if (gren.transform.position == mp)
            {
                deplace = false;
            }
        }

    }  

}

A oui dernière chose aprés jte soule plus, tu saurais des methodes pour améliorer ma logique?Désolé je suis encore débutant.
Merci d'avance!

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par jmhoubre » 15 Déc 2020 00:17

Bonsoir,

mettre la vitesse dans une variable et pas en dur dans le code présente les avantages suivants :
- si la variable est publique, ou reçoit l’attribut [SerializableField], elle apparait dans l'inspecteur quand l'objet qui porte son script est sélectionné. Cela permet par exemple de modifier sa valeur en mode Play, sans avoir à recompiler.
- la vitesse étant dans une variable, elle peut aussi être modifiée par le code. On peut ainsi modifier cette vitesse en fonction du poids porté ou des blessures subies, par exemple.

Pas sûr d'avoir compris la question...

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

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par Max » 16 Déc 2020 18:03

Hello,
le44 a écrit :
14 Déc 2020 14:10
... tu saurais des methodes pour améliorer ma logique?
Vu que tu cherches à simuler le lancement d'une grenade, essayer de passer par la physique serait une option intéressante à mon avis.
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

le44
Messages : 28
Inscription : 21 Oct 2020 15:15

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par le44 » 16 Déc 2020 20:46

Salut!
Merci pour vos réponses et merci de m'avoir prété attention!
J'ai refait mon code mais en beaucoup plus court (ayant séparé les autres choses dans différents scripts)ayant testé Vector3.MoveTowards sans aucune condition sans rien mais cela ne marche pas voyez-vous quelque chose?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class deplen : MonoBehaviour
{
    public Transform player;
    public float speed = 4.44f;
    public GameObject core;
    
    
    void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
        
        
    }
}

Merci d'avance!

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

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par Max » 16 Déc 2020 21:07

Bonsoir,
le44 a écrit :
16 Déc 2020 20:46
mais cela ne marche pas voyez-vous quelque chose?
Qu'entends-tu par "cela ne marche pas" ?
Là au lancement de ton jeu, ta grenade se déplace de suite sans aucun contrôle. je suppose que ce n'est l'objectif souhaité.
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

le44
Messages : 28
Inscription : 21 Oct 2020 15:15

Re: Vector3.MoveTowards et lerp se deplacent instantanément

Message par le44 » 19 Déc 2020 16:18

Salut!
En fait c'est juste que ca ne se déplace meme pas...Voila....
Si ta besoin d'autre explications dit-le moi!
A bientot!

Répondre

Revenir vers « Scripting »