[Résolu][DB-AL] déplacement objet aller retour

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
rewopro
Messages : 12
Inscription : 15 Fév 2017 09:23

[Résolu][DB-AL] déplacement objet aller retour

Message par rewopro » 15 Fév 2017 09:41

Bonjour , j'ai une petite questions , j'ai encore du mal à me servir de la doc de unity 3D et je suis débutant .

J'aimerais faire déplacer un cube vers le haut , et une foi arrivé à une certaine hauteur que le cube redescende jusqu'à un niveau et qu'il remonte et ainsi de suite .. je voudrais lui dire en gros : jusqu'à ce que le cube atteigne la hauteur de 5 faite le monter et ensuite redescendre jusqu'a -5 .

Code : Tout sélectionner


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class deplacement : MonoBehaviour {
 
 
    public GameObject cube;
 
    // Use this for initialization
    void Start () {
         
    }
     
    // Update is called once per frame
    void Update () {
 
        while (cube != Vector2(0, 5))
        cube.transform.position = new Vector2 (cube.transform.position.x, cube.transform.position.y + (1.0f * Time.deltaTime));
 
 
         
 
    }

Arrivé à ce niveau la
la ligne "while" ne fonctionne pas mais sans elle mon cube monte mais je ne sais comment l faire descendre arrivé à 5 sur la hauteur .
j'ai cherché sur internet mais je ne trouve pas de réponse ...
Dernière édition par rewopro le 15 Fév 2017 21:14, édité 1 fois.

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

Re: [DB-AL] déplacement objet aller retour

Message par boubouk50 » 15 Fév 2017 11:11

rewopro a écrit :j'ai cherché sur internet mais je ne trouve pas de réponse ...
Pour des questions de logique comme celle-ci, c'est plutôt du côté des cellules grises qu'il faut chercher, avec un soupçon de connaissances en algo, ou bien regarder du côté des animations sinon...
Aussi, une boucle while dans un Update est une hérésie pour une animation sur plusieurs frames. L'idée même de l'Update est de boucler à chaque frame. Dans ton algo, ton cube (si jamais le code fonctionnait) serait aller directement au point A.
Enfin, Comparer un cube à un vector2D, ce n'est pas possible pour la même raison qu'on ne compare pas un camembert avec un onde électrique.

Je te conseille donc, vu ton niveau de programmation de passer par une animation, si c'est tout ce que fait ton cube comme déplacement. Pour le coup, la c'est très simple à utiliser, il doit y avoir suffisamment de tutoriels sur le net, il y a aussi les Unity Learn.

Si tu veux persister en programmation, je te conseille dans un premier temps de suivre quelques cours sur le net (OpenClassRoom entre autres).

Faisons un peu de logique pour te détailler le raisonnement:
Un cube doit aller d'un point A à un point B puis revenir indéfiniment.
1/ Aller de A à B -> translate ou Lerp de position
2/ Déterminer si A est atteint
3/ Aller de B à A -> translate ou Lerp de position OU inverser A et B et refaire l'étape 1
4/ (Si pas revenu au 1) Déterminer si B est atteint et refaire l'étape 1

Maintenant, complétons tout ça: faut-il une vitesse déterminée ou un timing déterminé? Faut-il un déplacement linéaire ou lissé?
"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

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [DB-AL] déplacement objet aller retour

Message par DevAmat » 15 Fév 2017 11:23

Salut, la fonction Update est appelée une fois par frame pour une chose basique si tu veux le faire en code ne le fais pas en utilisant un while dans l'Update car c'est une boucle qui peut potentiellement ne jamais s’arrêter si la condition d'entrée est toujours vraie c'est ce que l'on appel une boucle infinie. Pour commencer basique utilise une condition if comme par exemple celle ci:

Ce script est a placer dans l'objet a mouvoir.

Code : Tout sélectionner

public class PingPong: MonoBehaviour
{
   public float Vitesse = 5; // on choisit la vitesse de déplacement
   public Vector2 Offset = new Vector2(-5, 5);  // tu as besoins de deux valeurs tu peux les stoker dans un Vecteur2
   
    private int direction = 1; // nous sert a changer de direction
	
	// Update is called once per frame
	void Update () {

        if (transform.position.y > Offset.y) // première condition "Si ..."
            direction = -1;
        else if(transform.position.y < Offset.x) // seconde si la première n'est pas vrai "Sinon si..."
            direction = 1;


        transform.position = transform.position + new Vector3(0, Vitesse * direction * Time.deltaTime, 0);  // Toujours multiplier par le temps 	   
    }
}


Il y a plein d'autre manière de le faire là c'est un exemple basique pour comprendre.
Si la résolution de ton problème et ce morceau de code te pose un souci c'est qu'il faut que tu travail les bases de la programmation. La base n'est pas compliquée mais c'est une logique a assimiler.

rewopro
Messages : 12
Inscription : 15 Fév 2017 09:23

Re: [DB-AL] déplacement objet aller retour

Message par rewopro » 15 Fév 2017 11:57

Merci pour vos réponses , Rapide en plus , c'est sympa !

Je vais voir ce que je peux faire avec vos codes , je vais les déchiffrer !
Pour ce qui est de mon niveau , c'est juste pour premier codage ! je connais les conditions , les variables , j'ai vu pas mal de vidéos mais je n'est pas trop pratiqué , je me disais que de faire monter puis descendre un cube serait simple pour commencer , j'arrive à faire monter mon cube mais pas à lui appliquer une limite pour le faire redescendre .

Je vais essayer vos codes et je reviens dans quelques temps si je n'arrive pas à les comprendre et/ou que je n'arrive pas à les appliquer .

Je souhaite en premier jeux faire un jeux 2D avec un joueur qui saute sur des cube qui bouge de haut en bas jusqu'à la passerelle qui le ferait changer de niveau .

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [DB-AL] déplacement objet aller retour

Message par DevAmat » 15 Fév 2017 12:16

La maîtrise de la programmation s’acquière avec énormément de pratique :coeur: .

rewopro
Messages : 12
Inscription : 15 Fév 2017 09:23

Re: [DB-AL] déplacement objet aller retour

Message par rewopro » 15 Fév 2017 13:13

Oui je vois ça en essayant d'apprendre , je me fixe de petit défis pour avancer , un petit jeu , puis ensuite rajouter un compteur , puis un level , puis un menu etc... en apprenant à chaque étapes grâce aux tutos etc...

Sur ceux j'ai refais le code , il fonctionne mon problème est résolu , j'ai fais ça :

Code : Tout sélectionner

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

public class deplacement : MonoBehaviour
{


	public float vitesse = 3; //Vitesse variable
	public Vector2 haut_bas = new Vector2(-5,5);
	int direction = 1;


	void Update ()
	{


		if (transform.position.y > haut_bas.y) 
			direction = -1;
		else if (transform.position.y < haut_bas.x) 
			direction = 1;


		transform.position = transform.position + new Vector3 (0, vitesse * direction * Time.deltaTime, 0);         
	}
}
Seul une chose que je ne comprend pas , à la dernière ligne , pourquoi utiliser un vector3 ? (j'ai essayer avec un vector2 et ça ne marche pas de toute façon :p )
Alors la je vois que tout fonctionne mais cela ne me serait pas venu à l'idée d'utiliser un vector3 puisque il faut juste renseigner la coordonnée y car les autres ne change pas .

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [DB-AL] déplacement objet aller retour

Message par DevAmat » 15 Fév 2017 13:50

On aurait pu penser que faire ce morceau de code fonctionne:

Code : Tout sélectionner

transform.position.y = transform.position.y + 10;
Mais non cela ne compile même pas car transform.position.y retourne une copie et n'est pas une variable. Modifier une copie n'a pas de sens. Donc il faut réassigner la variable transform.position qui est un Vecteur3. Donc pour réassigner:

Code : Tout sélectionner

transform.position = transform.position + new Vecteur3(0,1,0);
La notion de copie est importante il faut y faire bien attention.

ps: pour le vector3 en lui même transform.position est un Vector3 car il y a toujours un x, y, z dans les positions d'Unity qui est avant tout un moteur de rendu 3D même si il a un "mode" 2D .

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

Re: [DB-AL] déplacement objet aller retour

Message par boubouk50 » 15 Fév 2017 13:58

Tu as juste changé le nom des variables et virer les commentaires... C'est pas refaire, ça n'apporte rien. (Surtout que DevAmat respecte les conventions de nommage et l'anglais)
Comme le dit DevAmat tu ne peux pas modifier la transformation directement. C'est pourquoi la fonction Translate () existe. Au lieu de changer directement la position, tu bouges ton GameObject.
Egalement, par convention, Les noms de classe et de fonction commencent toujours par une majuscule et les noms de variable par une minuscule. Voir Notation Hongroise. (Cf nom de ta classe deplacement)

Aussi, si tu as résolu ton problème, édite ton premier message et ajoute [RESOLU] au début du titre.
"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 « (C#) CSharp »