[Résolu] Déplacement d'un GameObject

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
SidCamelot
Messages : 27
Inscription : 16 Oct 2018 23:14

[Résolu] Déplacement d'un GameObject

Message par SidCamelot » 30 Oct 2018 20:43

Bonjour à tous.

Je voudrais simuler à l’écran un déplacement type “robot”. Le joueur donne une série d’ordres par exemple : 1 en avant, 2 à droite, 1 en avant. Quand le joueur appuie sur “Start” le robot se déplace de 1 case en avant, 1 case à droite (2 fois) puis une case en avant.
Je stocke les ordres donnés dans des tableaux :

Code : Tout sélectionner

private int[] varGaDr = new int[5];
private int[] varHaBa = new int[5];
private int[] varAvAr = new int[5];

puis la fonction destinée à faire déplacer le robot :

Code : Tout sélectionner


 public void FoncAvance()
    {
        for (int i = 0; i < 4; i++)
        {
            varObjMonRobot.transform.Translate(varGaDr[i], varHaBa[i], varAvAr[i]);
        }
    }

        


Les “ordres” passent normalement et le robot se retrouve effectivement à la position voulue mais il le fait “d’un coup”. Je voudrais que ça se passe lentement de façon à ce qu’on voie bien le déplacement. J’ai bien essayé de jongler en multipliant les variables par Time.deltaTime, ça ne change rien.

J’ai forcément raté un truc… C’est quoi mon erreur ?

Merci d’avance.
Dernière édition par SidCamelot le 04 Nov 2018 20:02, édité 1 fois.

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [DB-AL] Déplacement d'un GameObject

Message par Farstone » 30 Oct 2018 21:50

Salut, alors déjà est-ce que tu veux ton GO se déplace du point A à Z en interpolant le tout ou tu veux qu'il se téléporte sur chaque case toutes les 1 seconde par exemple ?
Déjà je ne comprend pas l'utilisation de 3 tableau pour ton système, tu pourrait faire une queue avec une coroutine comme ça.

Code : Tout sélectionner

enum DirectionEnum
{
	haut,
	bas,
	gauche,
	droite
}
public Queue<DirectionEnum> m_directionHolder = new Queue<DirectionEnum>();
public GameObject m_varObjMonRobot;
public float m_jumpDistance = 1f;

public Update()
{
	if (Input.GetKeyDown(KeyCode.A))
	{
		AddPosition(DirectionEnum.haut);
	}
}

public void AddPosition(DirectionEnum direction)
{
	m_directionHolder.Enqueue(direction);
}

public void ProcessPositions()
{
	StartCoroutine("Routine");
}

IEnumerator Routine() 
{
    while(m_directionHolder.count > 0)
    {
    	DirectionEnum direction = m_positionsHolder.Dequeue();
    	Vector3 nextPosition;
    	switch(direction)
    	{
    		case DirectionEnum.haut:
    			nextPosition = new Vector3(0f, m_jumpDistance, 0f);
    		break;
    		case DirectionEnum.bas:
    			nextPosition = new Vector3(0f, -m_jumpDistance, 0f);
    		break;
    		case DirectionEnum.gauche:
    			nextPosition = new Vector3(0f, 0f, -m_jumpDistance);
    		break;
    		case DirectionEnum.droite:
    		    	nextPosition = new Vector3(0f, 0f, m_jumpDistance);
    		break;
    	}
    	m_varObjMonRobot.transform.position += nextPosition;
    	yield return new WaitForSeconds(1f);
    }
    yield return null;
}
La coroutine va dire à unity d'attendre 1 seconde avant la prochaine itération du while, quand la boucle est fini la coroutine prend fin avec le "return null".
Ensuite quand c'est le bon moment tu appel la coroutine avec la fonction ProcessPositions, si tu a du code perso a exécuter à chaque fois que ça se passe tu le met dans cette fonction :-D
Après je n'ai pas de debuger sous la main donc il doit surement y avoir une faute.

SidCamelot
Messages : 27
Inscription : 16 Oct 2018 23:14

Re: [DB-AL] Déplacement d'un GameObject

Message par SidCamelot » 31 Oct 2018 10:42

Merci pour ta réponse. J'ai mis les variables dans des tableaux car les déplacements peuvent avoir différentes valeur. L'idée c'est que le robot fait des pas qui ont des amplitudes différentes... Bref. Mon problème n'est pas à ce niveau, ce que je veux c'est que le déplacement soit "fluide". Quand le robot se déplace d'un point A à un point B il ne se téléporte pas. Je voudrais qu'on puisse observer chaque déplacement avec un temps d'arrêt à la fin de chaque pas. En passant par un KeyDown ça marche bien sur, mais là, les "ordres sont stockés. Un peu à la façon d'un programme et quand le joueur appuie sut un bouton (Start par exemple) le robot effectue les déplacements programmés. Par exemple 1 pas en avant (amplitude 12), 1 pas sur le côté (amplitude 5) etc.

Et pour ce qui est de la "pause" entre chaque pas, même en passant par une coroutine ça ne fonctionne pas :

Code : Tout sélectionner


    public void FoncAvance()
    {
        for (int i = 0; i < 4; i++)
        {
            varObjMonRobot.transform.Translate(PosX[i], PosY[i], PosZ[i]);
            StartCoroutine(MontTimer());
        }
    }

    IEnumerator MontTimer()
    {
        while (cont <= 5)
        {
            cont++;
            yield return new WaitForSeconds(1);
        }
    }


SidCamelot
Messages : 27
Inscription : 16 Oct 2018 23:14

Re: [DB-AL] Déplacement d'un GameObject

Message par SidCamelot » 31 Oct 2018 16:33

J'ai trouvé une solution pour que le robot marque un arrêt à chaque pas, en passant directement la ligne concernée dans la coroutine :

Code : Tout sélectionner

 IEnumerator Timer()
    {
        for (int i = 0; i < 4; i++)
        {
            yield return new WaitForSecondsRealtime(1);
            varObjMonRobot.transform.Translate(PosX[i], PosY[i], PosZ[i]);
        }
    }
Ca fonctionne mais est ce la bonne façon de procéder ? Je suppose que pour donner l'impression de mouvement entre deux pas je vais devoir faire une autre boucle à l'intérieur de cette coroutine... Votre avis ?

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

Re: [DB-AL] Déplacement d'un GameObject

Message par boubouk50 » 31 Oct 2018 18:18

Non, il te faut simplement une interpolation linéaire entre deux positions et un temps d'attente entre chaque position atteinte.
Dans l'idée, tu vas interpoler entre chaque frame la position A vers la position B pour t'en rapprocher petit à petit.
Une fois la nouvelle position atteinte (l'interpolant sera passé de 0 à 1), alors tu marques un temps d'arrêt avat de recommencer avec une nouvelle position.
https://docs.unity3d.com/ScriptReferenc ... .Lerp.html
"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

SidCamelot
Messages : 27
Inscription : 16 Oct 2018 23:14

[Résolu][DB-AL] Déplacement d'un GameObject

Message par SidCamelot » 31 Oct 2018 23:36

Ouah. Je me doutais bien d'un truc comme ça mais j'aurais jamais trouvé ! Merci, merci et encore merci boss :amen:

Répondre

Revenir vers « (C#) CSharp »