IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Script de déplacement de personnage - éclaircissements pour la compréhension du script


Sujet :

Unity

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Script de déplacement de personnage - éclaircissements pour la compréhension du script
    Bonjour,

    Nouveau dans la communauté, je souhaite vous demander quelques éclaircissements pour mon apprentissage du C#.

    Je travaille aujourd'hui au développement d'un petit projet de jeu que j'ai en tête depuis pas mal de temps (Rien de trop ambitieux pour le démarrage, c'est juste pour travailler mon apprentissage sur quelque chose de concret). J'essaye aujourd'hui de me former concrètement sur Unity, ayant enfin le temps nécessaire.
    Mon idée se présente, en terme d'aire de jeu et de positionnement caméra un peu comme un Bomberman, soit vu du dessus. Le personnage, ses déplacement et le terrain de jeu se présenteront exactement de la même façon.
    C'est là ou intervient le petit script de déplacement pour le personnage que j'ai tricoté, en épluchant les différentes variantes que j'ai pu trouver sur la toile.

    Le soucis c'est que la plupart des scripts pour des déplacements 2D que l'on trouve expliqués le sont pour des jeux de type plateforme, façon Mario à l'ancienne mode. Le déplacement est donc limité à l'axe des X, avec la possibilité de faire sauter le personnage. Nulle part je n'ai pu trouver de script permettant de contrôler le personnage à la fois sur l'axe des X et celui des Y.

    Voici donc le code que j'ai pu recomposer pour arriver à mes fins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using UnityEngine;
    using System.Collections;
     
    public class chocoboController : MonoBehaviour {
     
    		public Vector2 forceSaut = new Vector2(0,500);
     
    	// Update is called once per frame
    	void Update () {
    		Movement ();	
    				   }
     
    	void Movement ()
    	{
    		if (Input.GetKey (KeyCode.RightArrow)) {
    						transform.Translate (Vector2.right * 4f * Time.deltaTime);
    						transform.eulerAngles = new Vector2 (0, 0);
    									  		   }
     
    		if (Input.GetKey (KeyCode.LeftArrow)) {
    						transform.Translate (Vector2.right * 4f * Time.deltaTime);
    						transform.eulerAngles = new Vector2 (0, 180);
    									 		  }
     
    		if (Input.GetKey (KeyCode.A)) {
    			transform.Translate (Vector2.up * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector2 (0, 0);
    		}
     
    		if (Input.GetKey (KeyCode.Q)) {
    			transform.Translate (Vector2.up * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector2 (180, 0);
    		}
     
    		/* if (Input.GetKeyDown (KeyCode.Space)) {
    			rigidbody2D.AddForce (forceSaut);
    											  } */
    	}
     
    				   							   }
    Évidemment il y a un soucis^^
    Les quatre directions fonctionnent. mais je crois que le système "180°" pour déterminer la direction pose soucis : en effet, dès que j’appuie sur la touche permettant de faire redescendre le personnage, celui-ci se tourne immanquablement vers la droite. De sorte que même quand je demande au perso à la fois d'aller vers le bas et la gauche, celui-ci monte et part à droite.
    Pourriez vous m'éclairer sur une solution viable? Je ne demande pas à ce que l'on me serve ce script tout cuit dans le bec, l'idée c'est surtout de comprendre la démarche pour arriver au bon résultat, en assimilant correctement la philosophie de ce langage.

    Merci pour vos retours

  2. #2
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Salut Vaas Dewitt,

    Je ne suis pas expert en 2D avec Unity3D (désolé), mais en partant de ton script, et en sachant que pour les sprites l'axe de rotation est l'axe des Z, personnellement j'écrirais donc ton script plutôt comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    		if (Input.GetKey (KeyCode.RightArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0, 0);
    		}
     
    		if (Input.GetKey (KeyCode.LeftArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0, 180);
    		}
     
    		if (Input.GetKey (KeyCode.A)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0, 90);
    		}
     
    		if (Input.GetKey (KeyCode.Q)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0, -90);
    		}

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut et merci pour ton retour

    Effectivement, le script fonctionne mieux, je n'ai plus ce soucis de conflit dans les touches pour les différentes directions. Cependant l'axe des z pose un autre soucis : quelle que soit la direction, demandée, le script fera toujours pivoter le sprite : de sorte que quand on se déplace vers la gauche, il s'affiche à l'envers (la tête en bas), idem quand on passe du haut vers le bas le sprite s'inverse. Dans le principe, il faudrait que le sprite ne change pas d'angle dans son affichage, afin que je puisse lui assigner des animations par la suite (marche, saut etc...)

    Pour voir si j'ai bien saisi en revanche : A ce que je déchiffre, la différence principale entre nos deux scripts respectifs joue sur le fait que sur le tiens, le degré indiqué pour le changement de direction est codé via un "vector3", donc prenant en compte l'axe des Z.
    Ainsi, le sprite tourne autour de ce même vecteur en fonction de la direction demandée. Cela règle effectivement le soucis de bonne prise en compte de la direction, mais en revanche, -pour le peu de connaissance que j'ai- je ne suis pas sur que cela soit exactement la solution pour un déplacement en 2D : en effet, quand on lance une animation lors du déplacement du perso, cette animation est adaptée par symétrie lorsque le personnage prend la direction opposée à celle prévue initialement par l'animation (et ce uniquement sur l'axe des X en tout logique, pour le Y, on passe à une autre animation)

    Edit :

    J'ai tenté de composer un nouveau code, qui me semble bien plus simple et adapté à la situation, le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using UnityEngine;
    using System.Collections;
     
    public class testControle3 : MonoBehaviour {
     
    	public Vector2 forceSaut = new Vector2(0,500);
    	public float speed = 5f;
     
    	// Update is called once per frame
    	void Update () {
    		Movement ();	
    	}
     
    	void Movement ()
    	{
     
    		float x = Input.GetAxis ("Horizontal");
     
    		if(x > 0) {
    			transform.Translate (x * speed * Time.deltaTime, 0, 0);
    				  }
     
    		if(x < 0) {
    			transform.Translate ( -x * speed * Time.deltaTime, 0, 0);
    		 	 	  }
     
    		float y = Input.GetAxis ("Vertical");
     
    		if(y > 0) {
    			transform.Translate (0, -y * speed * Time.deltaTime, 0);
    		}
     
    		if(y < 0) {
    			transform.Translate (0, y * speed * Time.deltaTime, 0);
    		}
     
    		/* if (Input.GetKeyDown (KeyCode.Space)) {
    			rigidbody2D.AddForce (forceSaut);
    											  } */
    	}
    Soucis, bien qu'après plusieurs relectures, je n'arrive pas à trouver où ça coince, mon sprite ne se déplace que dans les deux sens principaux : vers la droite et vers le bas, les "-" devant le x et le y semble ne pas être pris en compte (dans " transform.Translate ( -x * speed * Time.deltaTime, 0, 0); ") alors que la solution semble pourtant devoir fonctionner (vue sur une vidéo tuto en ligne).
    Voyez vous ou l'erreur se cache?

    Merci pour votre aide

  4. #4
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    L'axe de rotation des sprites est l'axe Z. Dans ton cas, quand tu écris Vector2(0,180) tu omet de fait la troisième valeurs du triplet de rotation, qui est celle qu'il te faut pourtant modifier.
    D'ou l'emploi d'un Vector3 et non d'un Vector2 (cela peut déconcerter en 2D j'en conviens).
    D'ailleurs, tu peux regarder par toi même ce qui ce passe en rotation à travers l'éditeur:


    A savoir que tu peux changer le pivot du sprite, et donc la position de son axe de rotation.
    Après je n'ai pas trop suivit l'explication que tu a donné concernant les animation.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Désolé si j'ai manqué de clarté sur mon poste précédent. Pour être plus précis, voilà ce que ça donne concernant l'orientation du sprite que j'évoquais :
    Nom : affichage_chocobo.jpg
Affichages : 12297
Taille : 25,6 Ko

    En fait c'est tout à fait logique si le sprite tourne autour de l'axe z, mais c'est un peu déroutant^^

    Edit :

    Ok, j'ai pu modifier le script de façon à obtenir le résultat voulu sur l'axe des x tout du moins, voilà le script complet si cela peut intéresser quelqu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using UnityEngine;
    using System.Collections;
     
    public class testcontrole2 : MonoBehaviour {
     
    	public Vector2 forceSaut = new Vector2(0,500);
     
    	// Update is called once per frame
    	void Update () {
    		Movement ();	
    	}
     
    	void Movement ()
    	{
    		if (Input.GetKey (KeyCode.RightArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0, 0);
    		}
     
    		if (Input.GetKey (KeyCode.LeftArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 180, 0);
    		}
     
    		if (Input.GetKey (KeyCode.UpArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0 , 90);
    		}
     
    		if (Input.GetKey (KeyCode.DownArrow)) {
    			transform.Translate (Vector2.right * 4f * Time.deltaTime);
    			transform.eulerAngles = new Vector3 (0, 0 , -90);
    		}
     
    		/* if (Input.GetKeyDown (KeyCode.Space)) {
    			rigidbody2D.AddForce (forceSaut);
    											  } */
    	}
     
    }
    Je continue de regarder pour affiner tout ça, des que le script sera ok, je le reporterai ici au cas ou il puisse servir à quelqu'un.

  6. #6
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Re-Salut,

    Je comprend un peu mieux, dès le départ je pensais que tu cherchais à employer un sprite en vue du dessus, et non de coté, et donc l'orienter dans les 4 direction de base lors de ses déplacements.

    Pour ton second script, l'erreur vient tout simplement des "-" que tu as mis devant les x et y qu'il faut que tu retires

    D'ailleurs ton script se résume à quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transform.Translate (Input.GetAxis ("Horizontal") * speed * Time.deltaTime, Input.GetAxis ("Vertical") * speed * Time.deltaTime, 0);

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Greg Latiner Voir le message
    je pensais que tu cherchais à employer un sprite en vue du dessus, et non de coté, et donc l'orienter dans les 4 direction de base lors de ses déplacements.
    Bien vu je me suis effectivment mal exprimé, quand je disais vu du dessus, je pensais à la façon d'un Bomberman, ou d'un Zelda Snes, je n'ai pas réalisé l'influence que cette imprécision pouvait avoir.

    Citation Envoyé par Greg Latiner Voir le message
    Pour ton second script, l'erreur vient tout simplement des "-" que tu as mis devant les x et y qu'il faut que tu retires
    C'est ce qu'il semble, mais comme designer alors la négative de la valeur indiquée sans les "-"?
    J'ai déduit cette méthode grâce à cette vidéo (
    ), il s'agit pourtant bien de la syntaxe que l'auteur a utilisée (voir à 12mn25)

    Citation Envoyé par Greg Latiner Voir le message
    D'ailleurs ton script se résume à quelque chose du genre:
    Oui, c'est vrai, beaucoup de fioritures pour pas grand chose c'est l'effet recherche^^

    Merci pour tes retours et ta patience en tout cas

  8. #8
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Je comprend mieux l'histoire du script. En fait, tu l'as un peu amputé de lignes qui ont leurs importance (comme les instructions de rotations)
    C'est pour cela que l'auteur décompose la capture des axes.
    Le tuto est sympa sinon, il fournis quelques bases interessante pour démarer en 2D

Discussions similaires

  1. Réponses: 25
    Dernier message: 24/05/2006, 14h35
  2. [SNMP] Besoin d'aide pour SNMP, MIB dans script
    Par suya95 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 17/05/2006, 16h20
  3. [langage]Besoin d'aide pour debogage d'un script
    Par deadgod dans le forum Langage
    Réponses: 32
    Dernier message: 27/06/2005, 00h18
  4. Réponses: 2
    Dernier message: 11/07/2002, 08h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo