Documentation
Le visual scripting ne demande pas de coder, mais possède quand même certaines notions techniques. Cette page à pour vocation d'être un support aux Ateliers de MakeYourGame et à vos projets. Je vous conseille de la parcourir avant d'attaquer Bolt, et de chercher les chapitres dont vous aurez besoin pendant vos projets.
Aide technique pour Bolt
Cette page est là pour vous soutenir dans votre découverte et utilisation de Bolt. Il est inutile de l'étudier en détails avant de commencer Bolt, mais elle vous sera utile dans vos début comme référence et support technique. Les 3 grandes notions abordées sont les suivantes :
- Les types
- Les variables
- Les Graphes, Machines et Macros
Les types
Chaque élément dans Bolt possède un type, ce type va définir le type de comportement du composant. Il existe plus d'une centaines de type différents, mais n'ayez craintes, inutile de tous les connaître. Ici, nous allons voir les principaux types, ceux que vous serez amené à utiliser le plus souvent.
Note : En informatique les noms des types sont toujours écrit en anglais.
- Integer : Un nombre entier sans virgule, il peut être positif ou négatif comme : -3 ou 200.
- Float : Un nombre avec ou sans virgule, positif ou négatif comme : 0,5 ou -23,08 ou 10.
- Boolean : Sa valeur ne peut être que vrai ou faux souvent utiliser dans les tests logiques (égalité, plus petit ou plus grand que...)
- Char : Rarement utilisé, un unique caractère alphanumérique.
- String : Un texte comme un message, un nom...
- Enums : Une liste finie souvent utilisée dans les liste déroulante. Pour les plus curieux je vous invite à parcourir ce tutoriel C# sur les Enums ici .
- Vectors : Tout comme les vecteurs mathématiques, ils servent à déterminer des coordonnées, comme par exemple pour déterminer une direction ou une position. Le Vector 2, pour la 2D avec des coordonnées sur X et Y. Le Vector 3, pour la 3D avec des coordonnées sur X, Y et Z. Le Vector 4, avec des coordonnées sur X, Y, Z et W. (Rarement utilisé.)
- GameObject : Nous avions déjà évoquer ces fameux GameObject dans un autre atelier . Un GameObject est l'élement de base dans la scène Unity. Tout élément de la scène Unity est un GameObject.
- Lists : Les listes, un élément un peu plus complexe sa définition mathématique est : Une collection ordonnée d'éléments. C'est à dire une liste d'élément classé. Une liste peut contenir des éléments de n'importe quel type, mais le plus souvent les éléments d'une même liste sont tous du même type.
- Dictionnaries : Le dictionnaire est une sorte de liste, où chacun de ses éléments est associé à une clé unique. Par exemple le dictionnaire des utilisateur de MyG permet de stocker en mémoire les pseudo de chaque utilisateur (la clé unique) et leur niveau d'XP sur le site. En cherchant un pseudo, par exemple mon pseudo Twinkel, l'on obtient mon niveau d'XP sur le site.
- Object : Un type un peu particulier. Tous les autres types sont aussi des objets, le type objets est souvent utilisé comme un joker pour signaler qu'on attend n'importe quel type sans restriction.
Quand vous aurez besoin de sélectionner un type, Bolt vous fournira une liste, les plus courant que nous avons vu sont présent directement. Les autres sont regroupés dans les espaces de nom (voyez ça comme des dossiers).
Les variables, concept de base
Définition théorique
La définition de wikipedia :
En informatique, les variables sont des symboles qui associent un nom (l'identifiant) à une valeur. Le nom est unique[...]. Dans la plupart des langages et notamment les plus courants, les variables peuvent changer de valeur au cours du temps (dynamique).
C'est à dire qu'une variable est un conteneur où va être stocké toutes les données qui peuvent changer dans le temps, ou même en fonction des situations.
En pratique
En pratique, une variable est définit par 3 éléments :
- son nom,
- son type,
- sa valeur.
Dans Bolt, il existe 6 types de portée de variables. La portée d'une variable (ou scope) détermine depuis quel zone de votre code Bolt elle sera visible. C'est à dire si elle peut être lue et/ou modifiée.
- Type : Les Flow variables sont des variables locales. C'est à dire, que cette variable ne peut être utilisé que dans la fonction ou le bloc de code où elle est définie.
- Graph variable : Ces variables sont liées à un Graph. Elles ne peuvent être accédées et modifiées que depuis ce Graph. Ce sont les variables dont la portée (ou scope) est la plus restreinte.
- Object variable : Ce sont les paramètres de vos GameObject, ils sont partagés au travers de tous les graphes dans le jeu.
- Scene variable : Ces variables sont partagées par tous les objets de la scène. C'est à dire que ces variables seront disponibles temps que vous ne changez pas de scène.
- Application variable : Ces variables sont partagées par tous les objets et toutes les scènes, temps que l'application n'est pas fermée.
- Saved variable : Ces variables sont conservées même quand l'application est fermée. Elles sont conservées dans player prefs de Unity. C'est à dire que malheureusement elles ne peuvent pas être liées à des Objets Unity comme les GameObject ou les composant.
Dans Bolt, la fenêtre des variables
Pour ouvrir la fenêtre des variables, il suffit d'aller dans Windows > Variables. Chaque type de portée de variable possède un onglet. L'onglet Graph n'est disponible que si l'on a sélectionné un graphe, et l'onglet Object que si l'on a sélectionné un objet.
Ajouter une nouvelle variable
- Choisissez l'onglet du type de portée de variable que vous souhaiter.
- Saisissez le nom de votre variable dans le champ Name (en grisé New variable Name)
- Cliquez sur le bouton +
- choisissez son type (Float, Integer, String...)
- (Optionnel) Changez sa valeur par défaut.
Saved et Initial variables
Si vous vous êtes déjà baladé dans les onglets de créations de variables vous avez surement remarqué que l'onglet Saved a 2 sous onglet : Saved et Initial. Dans l'onglet Initial, vous pouvez créer des variables qui seront automatiquement généré pour chaque nouvelles parties. Dans l'onglet Saved, vous pouvez vérifier l'état des variables saved sur votre ordinateur. Vous pouvez les éditer manuellement, ou simplement les supprimer si vous le souhaiter. En résumé : l'onglet Inital permet de créer de nouvelle variables de portée Saved et l'onglet Saved (sous l'onglet principal Saved... Oui, on aurait pu faire mieux dans le choix des noms) permet de voir l'état des variables Saved que vous avez créés. C'est à dire voir leur nom, leur type et leur valeur.
Gagner en visibilité, supprimer les Headers
Si vous vous sentez suffisamment à l'aise dans la manipulation de vos variables, vous avez la possibilité de supprimer le Header qui prend quand même pas mal de place. Pour ce faire il vous suffit d'aller dans Tools > Bolt > Editor Preferences… et de décocher Variables Help.
Variables Dynamique
Vous n'êtes pas obligé de déclarer vos variables dans l'edit mode, vous pouvez tout aussi bien les créer et manipuler dans le play mode. En définissant la valeurs d'une variable qui n'existe pas encore, Bolt s'occupe pour vous de la créer.
Dans l'exemple ci-dessous la variable gold est créée automatiquement par Bolt pendant la partie.
Les Graphes
Je parle de ces fameux graphes depuis le début de cet atelier, il est temps de les manipuler un peu. Les graphes sont le cœur de Bolt, ils sont une représentation graphique de la logique que vous écrivez. Ceux qui connaissent les grafcets, ne seront pas dépaysé.
Il existe 2 type de Graph :
- Les Flow Graphs, dans lequel vous connectez des actions simple et des valeurs dans un certains ordre. Cet ordre d'action est appelé le Flow (Flot en français). Les utilisateurs de Unreal Engine qui utilisaient le langage Blueprints visual scripting retrouveront certainement des similarités.
- Les States Graphs, dans lesquels vous créez différents états et leur transition entre eux.
Quand utiliser quel graphs
- Soyons direct, la plus part du temps vous utiliserez un Flow graph. C'est eux qui s'exécute à chaque frame ou quand un événement se produit (par exemple une collision). EN résumé, ces Graphs répondent à la question : "Quand ça arrive -> je fais quoi ? -> Dans quel ordre ?". Je n'aime pas trop le terme, mais il est utilisé dans la documentation Bolt, donc je vous en parle, il est dit que les Flow Graphs relèvent de la logique bas niveau.
- Pour le cas des State Graphs, en opposition, ils relèvent de la logique haut niveau. Ils sont utilisés pour toutes mécaniques qui requiert une notion "d'état".
C'est à dire par exemple pour une porte : Dans quel état est elle ?
- Fermée à clé
- Fermée
- Ouverte
- en patrouille
- pourchasse le joueur
- attaque le joueur
- fuit
- va se replacer
Les Machines
Une Machine est un composant que vous utilisez dans un GameObject pour lui permettre d'exécuter la logique d'un graphe en playmode. Pour ce faire, il vous suffit de sélectionner le GameObject au quel vous voulez associé une logique, cliquer sur Add Componant, puis d'aller dans la section Bolt et enfin choisir le type de Graphes.
Note : Vous pouvez aussi les retrouvez dans le menu du haut de votre hub Unity, dans Componant > Bolt > ....
En pratique : Les deux types de graphes ouvrent la même fenêtre. Donc ici, je vais créer un Flow Machine.
Vous n'êtes pas obligé de nommer (title) et expliquer (summary) votre Machine Flow. Ces éléments ne sont pas utilisés par Unity pour faire fonctionner votre jeu. Néanmoins, je vous recommande fortement de donner un nom explicite et une brève explication à chacune de vos machines pour pouvoir les reconnaître et pouvoir organiser votre projet facilement.
Le bouton Edit Graph ouvre la fenêtre du graphe et l'inspecteur. Dans le cas où le GameObject sélectionné n'a qu'une seule machine, Bolt ouvrira automatiquement ce graphe pour vous.
Il ne reste qu'une option dont nous n'avons pas encore parler la source, elle a deux valeurs possible embed (incruster en français) ou macro.
Macros
Une macro est un graph réutilisable par plusieurs machine. Si vous définissez la source sur macro, Unity vous demandera de définir la source de cette macro. Comme on peut s'y attendre une Flow Machine attend une Flow Macro et une State Machine attend une State Macro.
Pour créer une nouvelle macro, dans l'explorateur de projet du hub Unity, faire un clic droit dans le dossier cible puis Create > Bolt > (Flow / State) Macro. L'organisation de votre projet n'a pas d'impact fonctionnel, par commodité et convention, je vous recommande de créer un dossier macro à la racine de votre projet.
Une fois votre macro prête, vous pouvez soit faire glisser votre macro dans votre machine, ou utiliser la recherche Unity pour retrouver votre macro et la liée à votre machine.
En résumé : Les macros permettent de factoriser les graphs pour limiter le travail en cas de modification. C'est à dire que la modification d'une macro impactera tous les objets au quel elle est liée.
Comment choisir la source à utiliser
Une macro semble n'avoir que des avantages par rapport aux sources embed, la macro est réutilisable, ne dépend pas d'un unique objet... Mais il existe des cas où le graph embed est plus adapté. Voici une petite règle pour vous aider à choisir.
- Le plus souvent, vous utiliserez une macro, elles sont plus simple à maintenir et à charger. Si votre graph est utilisé dans plus d'un GameObject ou Scene, il vaut mieux privilégié la macro.
- Dans le cas où votre graph ne sera utilisé qu'une et unique fois dans votre scene, il vaut mieux privilégié le graph embed. Ce qui vous permettra d'utiliser les scene references, ce qui vous sera utile pour préparer l'interface graphique notamment.
Changer du type de source
Il pourrait vous arriver de vouloir changer le type de source, il est normal qu'avec le développement de votre jeu vous souhaitiez réajuster certaine décision. Bolt nous permet de changer facilement le type de source.
De macro vers Embed
Par exemple, après avoir développé le comportement de vos monstres, vous souhaiter cacher un mini boss au milieu qui aura un comportement unique. Dans ce cas, il faut qu'il possède un graph Embed et qu'il ne dépende plus de la macro. Pour ce faire il suffit de cliquer sur le bouton convert juste à coté du type de source.
De embed vers macro
Reprenons l'exemple de notre boss caché. Finalement le niveau est trop simple, et vous souhaiter qu'il y est plusieurs boss caché avec ce comportement. Il vous faut donc une macro pour gérer le comportement de tous vos boss cachés. Encore une fois il vous suffit de cliquer sur le bouton convert, Unity vous demandera de spécifier le chemin et le nom de votre macro. Le reste du traitement sera gérer automatiquement par Unity. Attention : Les Scenes references ne sont pas supportés par les macros et seront donc perdus pendant le processus de conversion.