Wiki CraftStudio
Advertisement

Vous avez modélisé un personnage, texturé avec amour, vous lui avez même construit une petite carte où se dégourdir les jambes, et si vous avez lu les bases de ce tutoriel, vous devriez savoir y ajouter un script et lancer votre "jeu". C'est le moment d'entrer dans le vif du sujet : faire bouger votre personnage !

Théoriquement vous devriez avoir une scène de départ, avec un objet et un script associé fonctionnel. Si ce n'est pas le cas et si vous ne savez pas comment y parvenir, commencer par suivre ce tutoriel : Créer un script, le lier à un objet, faire un "hello world"

Faire bouger son personnage[]

Préparer la scène[]

Nous allons commencer par préparer notre scène :

  • Ouvrez votre scène.
  • Dans l'objet existant (qui doit pour le moment uniquement contenir un composant de script) ajouter un composant de modèle et associez-y votre modèle de personnage.
  • Ajoutez un nouvel objet dans la scène (indépendant du premier), renommez le "Camera" (ou quelque chose du genre) et ajoutez-y un composant caméra.
  • Déplacez votre caméra de façon à la positionner légèrement au dessus de votre personnage afin de pouvoir le voir bouger. Il n'est pour le moment pas possible de pré-visualiser le rendu de la caméra. Si vous ne savez pas vraiment ce que vous faîtes, contentez vous d'essayer d'obtenir quelque chose comme ça :
Tuto1 2

Votre scene avec un objet et une caméra.

Lancez votre scène, vérifiez que votre objet apparais à l’écran et que votre script se lance.




Aller tout droit[]

Dans un premier temps, nous allons simplement faire avancer notre objet avec la commande Move du composant transform. Le composant transform correspond au bloc de transformation qui est lié à chaque objet de votre scène. Toute les commandes (on devrait plutôt dire « méthodes ») du composants son présentées dans Référence Scripting/Transform .

On peut voir qu’il existe plusieurs méthodes pour déplacer notre objet : Move, MoveLocal et MoveOriented. La différence entre ces méthodes réside dans le repère par rapport auquel notre objet sera déplacé :

  • Move : déplacement par rapport à la scène
  • MoveLocal : déplacement par rapport à son objet parent (donc par rapport à la scène si l’objet n’a pas de parent)
  • MoveOriented : déplacement par rapport à son propre repère.

Dans notre cas, nous allons utiliser la méthode la plus évidente : « Move ». Sa définition est :

Transform:Move( [Vector3] offset )

Ce qui veut dire qu’elle s’applique à un composant Transform et qu’elle prend en paramètre un objet de type Vector3 qui représente l’offset  (l’amplitude) du déplacement.

C’est le bon moment pour aller voir la référence de l’objet Vector3 : Référence Scripting/Vector3 Un objet Vector3, comme son nom l’indique est un vecteur en trois dimensions. C’est simplement un outil mathématique qui nous servira à stocker une position, ou un déplacement, défini par trois coordonnées. Dans notre cas, nous voulons simplement déplacer notre objet le long de l’axe x. On utilisera donc le vecteur défini par : Vector3:New( 0.01, 0, 0 )


Il nous reste à récupérer le composant Transform de notre objet. Il existe plusieurs façons de faire, mais dans notre cas, le plus simple sera d’utiliser : self.gameObject.transform : self représente le script en cours d’exécution, self.gameObject représente l’objet auquel le script est associé et donc self.gameObject.transform représente le composant Transform associé à l’objet auquel est lié notre script !


On aura donc dans la fonction Behavior:Update() :

self.gameObject.transform:Move( Vector3:New( 0.01, 0, 0 ) )

Lancez votre jeux, vous devriez voir votre objet se déplacer vers la droite.

C’est bien beau, mais nous ne voulons pas que notre objet se déplace en permanence. Nous allons donc conditionner ce mouvement à l’appui sur une touche.

Toute les méthodes permettant de connaitre les actions effectuées par l’utilisateur sont rattachées à l’objet CraftStudio.Input et sont décrites ici : Référence Scripting/CraftStudio.Input

Les « Input » peuvent être de trois types : les axes, les boutons et la souris. Pour les mouvements de notre objet nous allons utiliser des axes. Dans les options de notre projet il doit déjà y avoir deux axes : "Horizontal" et "Vertical" liés aux touches z, q, s et d. 

Pour savoir si l’utilisateur veut aller vers la droite nous allons donc utiliser : CraftStudio.Input.GetAxisValue( "Horizontal" )

Cette fonction renvoie 1 si "D" est pressé, -1 pour "Q" et 0 pour aucune des deux.

Vous pouvez insérer print (CraftStudio.Input.GetAxisValue( "Horizontal" )) dans le Update() pour tester la commande.

De manière générale, n’hésiter pas à tester votre code au fur et à mesure à l’aide de print(). Penser quand même à supprimer les lignes de test au fur et à mesure pour ne pas alourdir votre code et la console de retour.

Au final notre script devient donc :

function Behavior:Update()
   if CraftStudio.Input.GetAxisValue( "Horizontal" ) == 1 then
       self.gameObject.transform:Move( Vector3:New( 0.01, 0, 0 ) )
   end
end

Testez, maintenant notre objet doit se déplacer uniquement lorsque vous appuyez sur la touche D.

Les autres directions[]

Nous voulons maintenant que notre objet aille à gauche, en haut et en bas lorsque nous appuyons sur q, s et z.

Essayer de compléter le script vous-même à partir de ce que vous venez d’apprendre.


Apres quelques tâtonnements, vous devriez obtenir quelque chose comme ca :

function Behavior:Update()

   if CraftStudio.Input.GetAxisValue( "Horizontal" ) == 1 then
       self.gameObject.transform:Move( Vector3:New( 0.01, 0, 0 ) )
   end
   if CraftStudio.Input.GetAxisValue( "Horizontal" ) == -1 then
       self.gameObject.transform:Move( Vector3:New( -0.01, 0, 0 ) )
   end
   if CraftStudio.Input.GetAxisValue( "Vertical" ) == 1 then
       self.gameObject.transform:Move( Vector3:New( 0, 0, -0.01 ) )
   end
   if CraftStudio.Input.GetAxisValue( "Vertical" ) == -1 then
       self.gameObject.transform:Move( Vector3:New( 0, 0, 0.01 ) )
   end

end

C’est un bon début non?

Par contre vous voudrez peut être accélérer un peu le déplacement. On pourrait remplacer à la main tous les 0.01 par une valeur plus importante, mais ce serais un peu fastidieux. Nous allons plutôt créer une variable qui stockera la vitesse de l’objet.


Il existe plusieurs types de variable : Globale, Locale ou Publique. (Je vous invite à consulter ce lien pour comprendre la différence https://dl.dropbox.com/u/51314747/CraftStudio/script_craftstudio.html, si ce n’est pas déjà fait)

Dans notre cas, nous pouvons utiliser les trois indifféremment, je vous conseil quand même fortement d’éviter au maximum d’utiliser des variables globales (ce n’est pas l’objet de ce tuto de vous expliquer pourquoi).


Dans notre cas, il vaux mieux utiliser une variable publique (self.MaVariable). Une fois déclarée dans l’initialisation du script (Behavior:Awake()) par :

self.vitesse = 0.05

Elle pourra être utilisée et modifiée partout dans ce même script. On peut donc remplacer tous les 0.01 par self.vitesse.


Pour améliorer la lisibilité de notre code, nous allons également stocker les valeurs des inputs dans des variables (locales cette fois-ci), elles seront donc recrées à chaque passage dans le Update. On obtient :

function Behavior:Awake()

   self.vitesse = 0.05

end

function Behavior:Update()

   local horizontal = CraftStudio.Input.GetAxisValue( "Horizontal" )
   local vertical = CraftStudio.Input.GetAxisValue( "Vertical" )


   if horizontal == 1 then
       self.gameObject.transform:Move( Vector3:New( self.vitesse, 0, 0 ) )
   end
   if horizontal == -1 then
       self.gameObject.transform:Move( Vector3:New( -self.vitesse, 0, 0 ) )
   end
   if vertical == 1 then
       self.gameObject.transform:Move( Vector3:New( 0, 0, -self.vitesse ) )
   end
   if vertical == -1 then
       self.gameObject.transform:Move( Vector3:New( 0, 0, self.vitesse ) )
   end

end


Pour simplifier encore plus les choses, nous allons créer un vecteur directement à partir des valeurs de retours des inputs :

local mouvement = Vector3:New( horizontal, 0, -vertical )


Ce vecteur vaudra donc par exemple (1,0,1) si on veux aller en bas à gauche.

Il nous reste à prendre en compte notre vittesse :

mouvement = mouvement * self.vitesse


Puis à appliquer ce vecteur comme mouvement à notre objet :

self.gameObject.transform:Move (mouvement)

Script complet[]

function Behavior:Awake()

   self.vitesse = 0.05

end

function Behavior:Update()

   local horizontal = CraftStudio.Input.GetAxisValue( "Horizontal" )
   local vertical = CraftStudio.Input.GetAxisValue( "Vertical" )

   local mouvement = Vector3:New( horizontal, 0, -vertical )
   mouvement = mouvement * self.vitesse
   self.gameObject.transform:Move (mouvement)

end

Faire bouger la caméra avec le personnage[]

Tuto1 3parenting

Objet parent d'une camera

Parfais, notre personnage peut donc se déplacer. Sauf que notre caméra est fixe, donc s'il sort de l'écran, il ne sera plus visible. Nous allons donc faire en sorte que la caméra suive notre objet. Pour cela, retournez dans votre scène, et dans la liste des objets, déplacer l'objet Camera sur votre Objet personnage vous devrier obtenir ça :

La caméra est devenue un objet "fils" du personnage. Si vous déplacer l'objet (dans l'édition de scène, ou dans le jeu par un script) la position de relative de camera par rapport à l'objet parent restera la même.

Faites un essai. Mince ! Si vous avez suivis exactement ce tutoriel, votre objet ne devrais plus sembler bouger, et pourtant il bouge, mais pas par rapport à la caméra, ce qui fait qu'il semble fixe !

Tuto1 4map

Vous n’êtes pas obligé de faire quelque chose d'aussi abstrait que moi !!

Pour vous en rendre compte, créez une nouvelle carte, positionnez quelques blocs pour avoir un terrain plat, puis ajouter cette carte dans votre scène. Déplacez le personnage pour qu'il soit sur la carte et lancez le jeu.





Conclusion : Voila ! Vous avez déjà une base simple pour créer un petit jeu. N'hésitez pas à le personnaliser, en modifiant les objets, la carte et le script.

Essayez par exemple de modifier le script pour que votre objet tourne en utilisant deux autres touches... (Dans une prochaine étape de ce tutoriel nous verrons comment orienter notre objet avec la souris !) Toutes les fonctions de transformation disponibles sont documentées dans l'API, n'hésitez pas à expérimentez et à posez des questions sur le forum ou le chat du community HUB en cas de problème !

Advertisement