Login
blog > psykopat > [Unity3d] Bien commencer avec Unity3d : déplacer un cube
[Unity3d] Bien commencer avec Unity3d : déplacer un cube
Posté par : Seb - Le Mardi 4 Mars 2014 à 21:50

 

Bienvenue sur ce premier tutoriel Unity3D. L'objectif du jour est de prendre en main cet outil pour développer vos jeux.

Avant toute chose il vous faudra quelques bases en POO (Programmation Orientée Objet). Si ce n'est pas déjà le cas je vous invite à lire quelques cours là dessus avant d'attaquer ce sera un plus indéniable.


Pour ce premier exercice nous allons concevoir un contrôleur basique qui permet de déplacer un cube en fonction des contrôles du joueur. Pour commencer, nous allons créer deux objets, un plan (GameObject->CreateOther->Plane) et un Cube (même menu). Positionnez le cube de sorte qu'il flotte légèrement au dessus du plan.


 

En cliquant sur le bouton play, la simulation commence. Mais rien ne se passe. C'est normal, nous allons maintenant créer un nouveau "component" et l'ajouter sur ce cube. Cliquez sur le cube et descendez en bas de l'inspecteur qui se situe sur la droite de votre écran. Cliquez sur "Add Component" > "New script", nommez le CubeController par exemple et sélectionnez de préférence le language CSharp.

 

Votre nouveau component est automatiquement ajouté à votre objet. Il est présenté par son nom et le type de component "(Script)" qui lui est associé. En double cliquant sur le champ "CubeController" Unity ouvrira automatiquement l'éditeur de code associé, par défaut MonoDevelop.

Vous arrivez dans un fichier de classe C# préconstruit dans lequel se trouvent 2 fonctions : Start et Update.
 

Start est la fonction appellée au démarrage du jeu, elle permet d'initialiser vos variables et faire des traitements préalables à l'exécution, tandis qu'Update sera exécuté à chaque boucle du jeu, environ 60 fois par seconde.

 

Puisque vous êtes familiarisé avec la POO vous remarquerez dans le début du fichier la déclaration de la classe
 

public class CubeController : MonoBehaviour 


Ceci implique que notre nouveau script hérite de la classe MonoBehaviour, ce sera le cas pour la grande majorité de vos scripts sur Unity, un petit tour dans la documentation, vous détaillera toutes les autres variables et fonctions utiles accessibles depuis votre classe.


Pour l'instant nous allons nous contenter de la fonction update. Vous aurez probablement remarqué qu'en déplaçant votre objet dans la scène vous avez modifié les valeurs du component "transform" (tout en haut dans l'inspecteur) de votre cube. Et bien nous allons faire exactement la même chose mais depuis le code de notre nouveau component CubeController.

 

Mon premier MonoBehaviour

La classe MonoBehaviour dispose d'un accesseur direct au component transform, c'est très pratique, et en consultant la documentation du fameux component Transform nous apprenons qu'il est notament composé d'une variable "Position", de type Vector3 qui représente sa position dans l'espace. Essayons de modifier sa valeur en lui ajoutant, à chaque boucle (ou frame) un léger déplacement.

 

void Update () {
    transform.position = transform.position + new Vector3(0.0f ,0.0f, 0.1f);
}

 

Cliquez sur le bouton play, et admirez votre cube se déplacer tout seul ! Concrètement, à chaque nouvelle image, le cube est position à sa position + un déplacement de 0,1 unité en Z. Vous pouvez modifier les valeurs de ce vecteur pour tester les autres directions. Mais vous pouvez aussi y brancher ... les contrôles du joueur !

 

Les inputs

Il existe de nombreuses façons de récupérer les entrées de l'utilisateur. Pour une première version nous allons nous contenter d'écouter les touches directionnelles avec la fonction Input.GetKey et d'interpréter ces touches pour déplacer notre cube.

 

void Update ()
{
		// Création d'un nouveau vecteur de déplacement
		Vector3 move = new Vector3();

		// Récupération des touches haut et bas
		if(Input.GetKey(KeyCode.UpArrow))
		   move.z += 0.1f;
		if(Input.GetKey(KeyCode.DownArrow))
			move.z -= 0.1f;

		// Récupération des touches gauche et droite
		if(Input.GetKey(KeyCode.LeftArrow))
			move.x -= 0.1f;
		if(Input.GetKey(KeyCode.RightArrow))
			move.x += 0.1f;

		// On applique le mouvement à l'objet
		transform.position += move;
	}

 

Lancez le jeu et déplacez votre objet avec les flèches directionelles. C'est magique !

 

Les variables

Maintenant que notre cube se déplace, nous aimerions peut-être pouvoir régler sa vitesse de déplacement plus simplement, nous allons alors créer une variable publique afin de pouvoir modifier sa valeur directement depuis l'inspecteur d'Unity :

 

public class CubeController : MonoBehaviour 
{
	// Déclaration de la variable de vitesse
	public float m_speed = 0.1f;

	void Update ()
	{
		// Création d'un nouveau vecteur de déplacement
		Vector3 move = new Vector3();

		// Récupération des touches haut et bas
		if(Input.GetKey(KeyCode.UpArrow))
			move.z += m_speed;
		if(Input.GetKey(KeyCode.DownArrow))
			move.z -= m_speed;

		// Récupération des touches gauche et droite
		if(Input.GetKey(KeyCode.LeftArrow))
			move.x -= m_speed;
		if(Input.GetKey(KeyCode.RightArrow))
			move.x += m_speed;

		// On applique le mouvement à l'objet
		transform.position += move;
	}
}

Vous avez désormais accès à cette variable directement dans la scène pour régler simplement la vitesse de déplacement de votre cube :
 



Voici les bases du déplacement, c'est aussi simple que celà. J'espère que ce premier tutoriel vous a permis de comprendre brièvement comment fonctionne l'intéraction entre les scripts et les objets dans Unity3d. Si vous souhaitez aller plus loin, laissez un commentaire et dites moi quelle est la prochaine étape que vous aimeriez atteindre. Ce cube pourrait être le début d'une grande aventure, devenir un personnage animé, un pétale de fleur ... ou pourquoi pas un véhicule qui franchit des montagnes et tire des feux d'artifices ! Laissez libre court à votre imagination !

 







Commentaires 21 commentaires

Mario le 16 Mars 2014 à 15:33

Salut je viens de me lancer dans Unity3D il y à très peut de temps et autant te dire que tes tutoriels sont de qualité !! très simple et surtout très compréhensible.
J'attends la suite avec impatient et surtout ne change rien !

Seb le 16 Mars 2014 à 16:37

Merci Mario :) S'il en est ainsi je vais essayer de pondre la suite :)

ernest33 le 25 Mars 2014 à 13:45

Oh oui la suite s'il te plait monsieur Seb :-)
Maitenant que j'ai un cube qui se déplace selon ma volonté (Ah ah i've got the power :-) )
J'attend avec impatience ton prochain tuto ;-)
Merci beaucoup !

invité le 14 Mai 2014 à 4:24

Bonjour, avant tout merci pour ce petit Tuto (j'attends la suite sans précipité personne), par contre j'ai eu un petit soucis. Bien évidemment j'ai copié/collé ce que vous nous avez donné. Je précise, je suis sous la version 4.3.4. Au niveau des Variables donc, et plus précisément au niveau de "Récupération des touches haut et bas" il y avait un problème avec "move.z". En effet la barre des abscisses étant "x" et celle des ordonnées "y", j'y ai donc remplacé "z" par "y". Et là plus aucun message du type "All compiler have to blablabla". C'était un détail pour les prochains qui rencontreraient le même problème que moi :). (Cette petite faute m'a fait cherché, relire, comprendre TOUTES ces premières ligne. Ca fait plaisir de sortir victorieux x)). Bonne continuation à tous !

Seb le 14 Mai 2014 à 8:04

Bonjour et merci pour vos retours.

En fait tout dépend comment vous placez la caméra et dans quelles directions vous souhaitez déplacer votre avatar. Dans mon cas il s'agit d'un objet se déplaçant horizontalement sur la surface du sol. Les axes x et z sont bien adaptés et correspondent à un déplacement dans la largeur et la profondeur de l'écran pour une caméra de base orientée vers z.

Vous pouvez parfaitement utiliser x et y pour déplacer votre objet vers la hauteur, toutefois il faudra garder en tête que l'axe couramment utilisé pour la gravité est y. Donc on aura tendance à préférer x et z pour un déplacement horizontal tandis que y correspond généralement à un saut ou un vol.

Je termine un gros projet actuellement, vous encouragements sont une source de motivation supplémentaire pour reprendre la suite de ces tutos dans les semaines à venir. Merci.

chris le 12 Août 2014 à 13:12

Bonjour j'aimerais pouvoir ouvrir une porte dans mon jeu en mettant la souris dessus la porte doit glisser par la droite comment faire? merci

Berserage le 29 Avril 2015 à 14:04

Merci pour ce petit tuto, simple et efficace ;-)

Felinx le 14 Mai 2015 à 14:33

Merci, mais j'ai un problème: a la ligne 9 sa me met Inser a semicolon at the end. Je ne sais pas se que c'est Aider-moi SVP

Seb le 19 Mai 2015 à 17:16

@felinx > Il vous manque un point-virgule à la fin de votre ligne, ou une parenthèse qui perd le compilateur.

AIDLINN le 06 Avril 2016 à 14:51

J'dois vous dire.... vous venez de me sauver d'une semaine de galère haha..... merci encore
Néanmoins mes flèches gauches et droites beugent. J'explique je veux aller à droite çà va à droite. Mais quand je vais à gauche ben je vais à droite...... je me demande si c'est pas un problème d' axes....... merci

Seb le 06 Avril 2016 à 14:57

Bonjour Aidlinn,
A priori l'axe est bon, c'est la direction qui ne marche pas à gauche. J'ai peut-être oublié d'expliquer les opérateur += et -=.

var += 1;

et équivalent à var = var + 1;

De la même manière, -= soustrait la valeur à la variable.

J'imagine donc que vous avez un += et non un -= dans le code de la touche gauche, ce qui a pour effet de déplacer votre objet dans le bon axe, mais la mauvaise direction.

invité le 04 Septembre 2016 à 15:00

merci pour les précieux tuto
j'aimerai bien savoir comment faire des mouvements sur l'axe local de l'objet
merci

Seb le 04 Septembre 2016 à 15:07

Bonjour,
Il suffit d'utiliser les propriétés transform.forward, transform.up et transform.right de l'objet pour avoir ses axes dans le monde.

Si vous tenez réellement à travailler dans le repère de l'objet il faudra utiliser la fonction transform.InverseTransformPoint (ou InverseTransformVector, InverseTransformDirection selon le besoin) et vous aurez transposé votre position dans le monde dans le repère local de l'objet.

Studiaton le 12 Octobre 2016 à 14:48

Bonjour, travaillant en même temps sur d'autre tuto je viens de remarquer que le système de collision ne marchait pas avec cette méthode, enfin, je crois que c'est à cause de la méthode... Pouvez-vous m'aider ?

Seb le 12 Octobre 2016 à 16:04

En effet Studiaton, cette méthode basique déplace le gameObject, j'avais prévu dans un tutoriel suivant d'expliquer une autre méthode mais plus compliquée puisqu'elle consiste à déplacer le rigidbody lui même en appliquant des forces. Le soucis de cette méthode c'est qu'il faut bien comprendre que sans frottements le rigidbody va cumuler les accélérations et ne jamais s'arrêter !
C'est donc un sujet plus compliqué que l'objet de ce mini tuto qui avait simplement pour vocation de donner quelques bases pour utiliser Unity, mais votre remarque est tout à fait correcte.

invité le 01 Janvier 2017 à 17:18

slt a tous et merci pour le tuto il m'a vachement aidé mais c'est juste a la fin quand je modifie ma fonction speed dans unity la vitesse reste la meme donc c'etait pour savoir si quelqu'un savait pourquoi

Seb le 01 Janvier 2017 à 18:12

Bonjour à toi. Et bonne année.
En fait il faut faire attention, la variable

public float m_speed = 0.1f;

est publique, elle sera donc sérialisée (enregistrée) sur l'instance de ton objet. Si tu modifies la valeur dans le code les instances déjà créées garderont leur ancien paramètre. Par contre si tu édites la valeur de speed puis l'inspecteur dans ta scène, tu devrais voir la différence :)

invité le 04 Février 2017 à 15:16

Salut,
J'ai essayé d'utiliser ton script pour changer l'orientation de mon cube à l'aide d'un gyroscope branché via le port "COM4" sur mon ordinateur. J'ai déjà fais ça sur un programme C# annexe (récupération des données du gyroscope) mais quand j'essaie de recopier ça dans mon programme cubecontroller, on me dit sur "using System.IO.Ports;" que je cite "The type or namespace name "Ports" doesn't exist in the namespace "System.IO".

Je ne me suis mis que très recemment à la programmation donc je comrendrais si ma question est bête ou si j'ai pas bien assimilé tout le concept ^^

Merci par avance et bonne soirée !

Seb le 04 Février 2017 à 19:56

Bonjour,

Votre soucis peut venir de l'implémentation de C# d'Unity, à priori la librairie "System.IO.Ports" n'est pas trouvée à la compilation, c'est qu'elle n'existe pas dans le contexte actuel. Si votre cible est une console ou un périphérique Android/iOs c'est normal, switchez simplement vers une plate-forme Windows. Si ça ne marche pas même sous Windows c'est que cette librairie n'est pas disponible à l'heure actuelle dans Unity. Dans ce cas il faudra probablement utiliser un plugin externe pour faire ce que vous voulez.

N'hésitez pas à partager vos avancées ici, je suis curieux d'avoir la réponse :)

invité le 04 Février 2017 à 20:23

Salut,
En fait j'avais mal paramétré l'"API Compatibility Level" qui était sur ".NET 2.0 Subset" au lieu de ".NET 2.0" ! Par contre, dans la fonction start, j'ai initialisé mon port ( SerialPort myport = new SerialPort();
myport.BaudRate = 9600;
myport.PortName = "COM4";
myport.Open();)

Et ça à l'air de fonctionner, par contre quand je cherche à appeler monport dans l'update en faisant monport.WriteLine par exemple, on me dit que monport n'existe pas dans le contexte actuel, des idées du pourquoi ?

Merci encore :)

Seb le 05 Février 2017 à 15:55

Hello,

Non malheureusement pas la moindre idée je ne connais pas du tout cette partie là de l'API. La variable "monport" est bien celle initialisée au start ? Si elle permet de récupérer les données correctement je ne vois pas de raison à ce qu'elle renvoie cette erreur par la suite.

Est-ce que la connexion respecte bien la procédure prévue dans la doc ?
https://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport.writeline(v=vs.110).aspx



.laisser un commentaire




Codes html interdits. Les liens sont convertis automatiquement.

Réalisation

Code & Design : Sébastien Cardona

Page générée en : 0.011168s