[DB-AL] Déplacement "Case Par Case"

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

[DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 04 Nov 2018 20:19

Bonjour tout le monde. En grande partie grâce à ce forum j'arrive (doucement) à concrétiser mon petit programme. Tout fonctionne comme je le souhaite et j'ai enfin réussi à obtenir l'effet que je voulais. A savoir, un robot qui se déplace case par case, qui marque un arrêt à la fin de chaque pas avec une "translation" (je ne voulais pas que le robot se téléporte d'un point à un autre) entre chaque pas. Voilà le script :

Code : Tout sélectionner

public class SimiliCase : MonoBehaviour
{
   
    Vector3 pos;                            
    float speed = 1.0f;                         

    void Start()
    {
        pos = transform.position;         
    }

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Z) && transform.position == pos)
            pos += Vector3.up;
            Debug.Log("J'avance d'une case !");
        }
 
        transform.position = Vector3.MoveTowards(transform.position, pos, Time.deltaTime * speed);   
    }
A ce stade ça me convient tout à fait et faute de mieux je continuerai sur cette base. Seulement je me demande (je vous demande) si il n'y a pas un moyen d'arriver au même résultat an passant par un Grid ou une Tilemap. C'est à dire de se déplacer d'une Tile de la Tilemap (ou du Grid) à une autre par rapport aux coordonnées de cette Tile ?

Je viens de passer mon week-end à fouiller un peu partout et je n'ai pas trouvé de réponse simple. J'ai bien trouvé des scripts et des exemples de déplacement qui fonctionnent par rapport à une Grid, mais c'est toujours vachement compliqué.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Déplacement "Case Par Case"

Message par djulio74 » 04 Nov 2018 20:57

Je te laisse voir mon WIP "sheep" , je déplace en me servant de case en case , avec des array.
Si ça peut te convenir je peux essayer demain de te faire une petite explication :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: [DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 04 Nov 2018 22:43

J'ai vu ton mouton fou, et aussi ta simul de conduite. :merci: Chapeau bas. Je ne navigue pas du tout dans ces sphères là en matière de programmation. Par contre j'adore les simuls de course (en particulier GP legend, je suppose que tu connais).

Sinon, ma question c'était plutôt de savoir si Unity avait "prévu" que les Tilemap (ou la Gird plutôt) puisse être utilisée aussi pour se déplacer. Je pense que oui, mais je n'arrive pas du tout à trouver un exemple simple qui permet d'aller d'une case A à une case B.

Donc si vous connaissez la réponse genre :
- Non, c'est pas prévu, continue comme ça (ou mieux si vous avez à proposer je suis aussi preneur)
ou
- Oui, c'est prévu c'est facile... (un petit exemple de code serait très apprécié)
- Oui, c'est prévu mais pas très pratique, laisse tomber...

Bref, merci d'avance.

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [DB-AL] Déplacement "Case Par Case"

Message par Liven » 04 Nov 2018 23:20

Les tilemaps sont principalement prévue pour faire des obstacles (dans mon ping, il y a un exemple dans le deuxième tableau de la section xp/obstacles).
Si ont veux l'utiliser pour faire un système de déplacement ça peux vite devenir compliqué car pas prévu de base.

Sinon, tu devrais passer ton code en Update plutôt que fixedupdate.
Le fixed, c'est plutôt pour la physics et ça peu faire bugguer la captation des inputs.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Déplacement "Case Par Case"

Message par djulio74 » 05 Nov 2018 07:57

Alors en effet si les tilemap ou grid ne sont pas le plus adéquate d’après Liven , il va falloir faire autrement.
Je ne connais pas ces tilempa ou grid, mais si j'ai bien compris, c'est pour la 2D principalement.

Donne nous un peu plus de détails concernant ton projet ( 2D?3D? etc..) ce qui permettra de mieux te guider dans un solution appropriée pour replacer ces tileMap ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: [DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 05 Nov 2018 14:41

Alors voilà, mon projet c'est une course de robot. Pour piloter un robot on "programme" les déplacements en appuyant sur des boutons (Avance, tourne à 90°, fais un pas de côté", recule...). Les ordres s'empilent, et au bout du 10ème ordre on peut appuyer sur un bouton "Start" qui va exécuter tous les ordres à la suite. A ce stade, j'obtiens exactement ce que je veux et je déplace mon robot comme je le souhaite en utilisant la méthode de déplacement que j'ai montré plus haut. Avant d'attaquer la suite, à savoir les interactions avec l'environnement (par exemple un autre robot qui qui pousse le premier robot ce qui va forcément influencer le reste du déplacement, ou des obstacles etc.) je voudrais savoir si la méthode que j'utilise pour gérer mes déplacements constitue une bonne base.

Le tout est en 2D vue du dessus, et c'est du "tour par tour" ou chaque ordre effectué est un tour différent. C'est pour ça que le système de Gird et de Tilemap m'intéresse. Un déplacement case par case serait parfait pour moi.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] Déplacement "Case Par Case"

Message par djulio74 » 05 Nov 2018 15:00

Ok je vois un peu mieux ton projet.
Dans ton cas, je verrais bien une liste "Cases" de Vector2, qui seraient les coordonnées de chaque case ( Vector2 car 2D), et une liste "Occupe" de bool pour savoir si une case est occupé ( robot adverse ou obstacle)
chaque élément de la liste de bool correspond a un élément de la liste Vector2, donc a une case.

Quand ton robot est sur une case, il la marque true pour le bool correspondant, quand il la quitte , il marque false.
quand ton robot se déplace, s'il tombe sur une case avec son bool à true ( il y a un obstacle ou un robot adverse), il n’effectue pas le déplacement voulu et passera au prochain.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: [DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 05 Nov 2018 15:26

Mais comment j'obtiens les coordonnées des cases ? Il faut que je crée un array à 2 entrées (un pour les X un pour les Y par exemple). Mais c'est justement ce que j'aurai voulu éviter parceque il me semble que c'est plus simple de se servir d'une tilemap sur laquelle je vais ensuite ajouter des colliders non ?

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

Re: [DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 05 Nov 2018 18:36

J'abandonne les cases, ça m'a lair trop compliqué pour moi :cry: Du coup, j'ai un autre problème. Avec mon code le robot se déplace exactement comme je veux mais quand je lui fais faire une rotation à 90°, le déplacement suivant avec Vector3.MoveTowards le fait se déplacer vers le haut (logique, puisqu'il se déplace par rapport au monde). Et moi je voudrais qu'il se déplace par rapport à soi même. Quand je code le déplacement de cette manière :

Code : Tout sélectionner

if (Input.GetKeyDown(KeyCode.E))   // Pivot D
        {
            monRobot.transform.Rotate(Vector3.forward * -90);
        }
le robot pivote comme prévue, et l'instruction suivante :

Code : Tout sélectionner

 monRobot.transform.Translate(Vector3.up);
fait avancer effectivement le robot dans la bonne direction. Mais au passage j'ai perdu l'effet de mouvement que j'avais avec :

Code : Tout sélectionner

transform.position = Vector3.MoveTowards(transform.position, pos, Time.deltaTime * speed);   
Au secours, vraiment je m'arrache les cheveux :? ... Heureusement j'en ai un paquet !

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

Re: [DB-AL] Déplacement "Case Par Case"

Message par SidCamelot » 05 Nov 2018 18:50

https://youtu.be/UA37MlxGB6A
Voilà ce que ça donne. Ce que je n'arrive pas à résoudre c'est le mouvement saccadé entre chaque pas.

Répondre

Revenir vers « (C#) CSharp »