Comment faire un contrôleur de jeu personnalisé avec Arduino et Unity

Comment faire un contrôleur de jeu personnalisé avec Arduino et Unity

Avez-vous déjà voulu concevoir votre propre contrôleur de jeu ? C'est plus facile que vous ne le pensez!





Dans ce court projet, nous allons créer un contrôleur de jeu personnalisé simple à utiliser avec le moteur de jeu Unity. Ce contrôleur sera alimenté par un Arduino Uno, bien que vous puissiez également utiliser l'une des nombreuses alternatives disponibles pour ce projet. Nous allons également créer un jeu de base où vous utiliserez votre manette pour éviter les chutes d'objets et ralentir le temps.





Pour ce projet, vous aurez besoin

  • Arduino ou microcontrôleur similaire
  • 1 résistance de 10k Ohm
  • 1 x interrupteur momentané
  • 1 x potentiomètre
  • Fils de branchement
  • Une planche à pain
  • Moteur de jeu Unity
  • Le plugin Uniduino de Unity Asset Store (30 $)
  • Code de projet complet, au cas où vous ne voudriez pas l'écrire (n'inclut pas le plugin Uniduino)

La plupart de ces éléments sont disponibles dans un kit de démarrage Arduino. Si vous n'avez pas de kit de démarrage, consultez notre guide pour choisir celui qui vous convient le mieux.





Vous pouvez rendre votre contrôleur aussi compliqué que vous le souhaitez, mais pour cet exemple, nous allons configurer un potentiomètre et un bouton - parfaits pour contrôler un jeu d'arcade simple.

Assemblage de votre contrôleur

Configurez votre maquette et Arduino comme indiqué dans l'image ci-dessous. C'est ce que nous utiliserons comme contrôleur de jeu, bien que vous puissiez utiliser presque exactement la même configuration qu'un Contrôleur midi bricolage trop!



Préparer votre Arduino

Une fois que vous avez tout câblé, connectez votre Arduino via USB. Dans Arduino Software IDE, dirigez-vous vers Outils > Tableau et Outils > Port pour sélectionner le microcontrôleur et le port que vous utilisez. L'IDE Arduino est livré avec le croquis dont nous avons besoin, et vous pouvez le trouver sous Fichier> Exemples> Firmata> StandardFirmata . Cliquez sur Télécharger et vous serez prêt à partir.

Si vous êtes nouveau sur Arduino et que votre tête fond légèrement, consultez notre Guide du débutant pour vous aider à le faire parler correctement avec votre ordinateur.





Configurer votre projet Unity

Dans Unity, ouvrez Fenêtre > Magasin d'actifs pour accéder à l'Asset Store de Unity depuis l'éditeur Unity. Recherchez le plugin Uniduino dans l'Asset Store. Ce plugin vous permettra de recevoir et d'envoyer des données vers et depuis vos broches Arduino dans Unity. Le plugin au moment de la rédaction coûte 30 $. C'est possible faire ce projet sans acheter le plugin, bien que ce soit un peu plus compliqué et que vous puissiez trouver le plugin plus pratique à tous points de vue.

Cette vidéo des créateurs du plugin vous guide à travers le processus de test de tout fonctionne, ainsi que la première configuration. Notez que vous devrez peut-être également réinitialiser l'éditeur Unity sous Windows.





Nous pouvons utiliser ce même panneau de test pour tester notre contrôleur. Réglez la broche D2 sur INPUT et Digital. Plus bas, réglez la broche A5 sur ANALOG. Votre potentiomètre et votre bouton devraient maintenant afficher des valeurs à l'écran à côté de leurs numéros de broche. Le progrès!

Maintenant, faisons quelque chose que nous pouvons contrôler

Nous avons donc un contrôleur, mais que contrôlerons-nous ? Eh bien, les possibilités sont infinies, mais pour aujourd'hui, nous allons créer un jeu d'esquive très simple pour tester notre nouveau système de contrôle. Nous allons passer en revue la configuration du jeu assez rapidement, donc si vous êtes totalement nouveau sur le moteur Unity, vous pouvez trouver notre Guide du débutant pour la programmation de jeux Unity utile pour se repérer.

Nous allons construire un jeu très basique dans lequel votre objectif est d'esquiver votre sphère vers la gauche et la droite pour éviter la chute de cubes, qui utilisera votre nouvelle manette personnalisée.

Créez une nouvelle scène et faites glisser le préfabriqué Uniduino de Atouts > Uniduino > Préfabriqués dans votre hiérarchie et faites glisser le préfabriqué Uniduino dans la hiérarchie. Nous en avons besoin pour faire la conversation entre notre jeu et la manette.

Dans la hiérarchie Unity, cliquez sur Créer > Sphère et utilisez l'onglet Transformer dans l'inspecteur pour le déplacer vers le bas de l'écran de jeu.

Il est temps de coder

Maintenant, ajoutons du code à cette fête. Avec la sphère sélectionnée dans la hiérarchie, cliquez sur Ajouter un composant > Nouveau script au bas de sa fenêtre Inspecteur. Nomme le sphereMover et sélectionnez C pointu dans le menu déroulant. Cliquez sur Créer et ajouter et le script sera ajouté au GameObject. Double-cliquez dessus pour ouvrir le script et entrez ce code :

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

Prenez un moment pour lire les commentaires du code. Jusqu'à présent, nous avons déclaré des variables pour notre Arduino, ses broches et notre sphère. Nous avons également utilisé le

Méthodes Start et ConfigurePins pour initialiser notre Arduino au moment de l'exécution. Enregistrons notre script et retournons dans l'éditeur Unity et voyons ce qui a changé.

Nous pouvons maintenant voir nos variables publiques dans la fenêtre Inspecteur. Voyons ce que nous pouvons saisir à ce stade pour nous aider plus tard. Nous savons quelles broches nous utilisons sur l'Arduino depuis notre version précédente, nous pouvons les saisir. Nous savons également, grâce à notre expérience précédente, jusqu'où nous voulons que notre sphère puisse voyager à gauche et à droite afin qu'elle ne tombe pas de l'écran. Entrons maintenant ces valeurs.

Premiers signes de vie

Il est temps de voir les valeurs de notre Arduino dans l'éditeur Unity. Pour l'instant, nous pouvons ajouter une ligne de code à la fonction de mise à jour de notre script sphereMover et enregistrer à nouveau le script.

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

Maintenant que notre variable potValue est mise à jour à chaque image, nous pouvons voir sa valeur en temps réel dans Unity Inspector. Avant de le tester, le moment est venu de vérifier que le plug-in Uniduino écoute sur le bon port. Cliquez sur Uniduino dans la hiérarchie et vérifiez son nom de port dans l'inspecteur. S'il est vide, remplissez le numéro de port correct pour votre Arduino. Dans ce cas, il s'agissait de COM4, ​​bien que cela puisse être différent pour vous. Vérifiez en utilisant l'IDE Arduino si vous n'êtes pas sûr.

Sélectionnez votre sphère dans la hiérarchie et cliquez sur le bouton Lecture en haut de l'écran. Le système a besoin de quelques secondes pour s'initialiser, après quoi vous devriez commencer à voir la variable Pot Value changer dans l'inspecteur lorsque vous déplacez le potentiomètre.

Maintenant on parle ! Bon, à proprement parler Unity et l'Arduino parlent, mais qui compte ? Si vous êtes arrivé jusqu'ici et que vous ne voyez pas la valeur changer dans l'inspecteur, vérifiez les étapes de configuration et assurez-vous que le bon port est sélectionné pour votre Arduino.

Déplaçons cette sphère

Maintenant que nous avons mis à jour la variable potValue, nous voulons utiliser cette valeur pour déplacer notre sphère. Lorsque le potentiomètre est complètement à gauche, nous voulons que la sphère soit sur le côté gauche de l'écran, et vice versa. Les objets dans Unity sont positionnés à un point dans l'espace vectoriel, déterminé par les valeurs de ses Transformer.position . Dans l'image ci-dessous, où la sphère est au point le plus à gauche, nous le voudrions, vous pouvez voir que son vecteur de position est 9.5, -4, 0.

Nous voulons affecter la position X de la sphère. Malheureusement, l'utilisation directe des valeurs de notre potentiomètre ne fonctionnera pas, car lorsque le potentiomètre est complètement à gauche, il donne une valeur de 0 - ce qui placerait notre sphère en plein milieu de l'écran. À l'autre extrême, la valeur supérieure du potentiomètre, 1023, placerait le cube loin à droite de notre écran. Pas utile. Ce dont nous avons besoin ici, ce sont des mathématiques.

Pourquoi faire des maths quand Unity le fera pour vous ?

Pour ceux d'entre vous qui redoutent de regarder un morceau de papier couvert de chiffres absurdes (bien qu'il y ait quelques grands sites Web qui peuvent vous aider à apprendre les mathématiques), n'ayez crainte. Nous avons besoin d'un moyen de faire correspondre nos valeurs de potentiomètre avec la position X de notre sphère. Heureusement, nous pouvons utiliser un Méthode d'extension .

Une méthode d'extension est un script qui effectue un travail spécifique pour nous. Dans ce cas, nous lui donnons les valeurs que nous avons, et il les renvoie mappées les unes aux autres, prêtes à être utilisées dans notre sphereMover scénario. En haut du panneau Projet, cliquez sur Créer > Script C# et nommez-le ExtensionMethods. Entrez le code ci-dessous dans le script :

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

Enregistrez le script et revenez à votre script sphereMover. Nous pouvons maintenant utiliser cette fonction Remap dans notre script ExtensionMethods dans notre fonction Update pour convertir nos valeurs de potentiomètre en valeurs utilisables dans notre jeu. Sous où nous venons d'affecter la variable potValue, tapez ce qui suit :

L'invite nous montre que notre remappage prend deux ensembles de valeurs De et À, et les mappe ensemble. Nous pouvons y inscrire nos valeurs.

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

Enregistrez votre script, revenez à l'éditeur Unity et appuyez sur le bouton de lecture. Vous devriez maintenant voir que la variable Pot mappé change lorsque vous déplacez le potentiomètre, pour correspondre aux valeurs que nous avons déterminées pour nos bords gauche et droit. Prenez un moment pour vous asseoir et remercier votre script ExtensionMethods. Pas une calculatrice en vue.

Remarque : si vous remarquez que vos valeurs sont inversées, donc lorsque votre potentiomètre est complètement à droite, vous obtenez une valeur négative pour votre variable Pot mappé, il se peut que votre potentiomètre soit configuré à l'envers. Heureusement, vous pouvez résoudre ce problème sans faire de recâblage. Vous pouvez simplement changer les valeurs lorsque vous les remappez :

Maintenant, nous avons enfin des valeurs utilisables. Il ne reste plus qu'à affecter ces valeurs à la position X de notre sphère :

sites Web sympas à visiter quand on s'ennuie
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Enregistrez votre script, revenez à l'éditeur Unity et appuyez sur play. Vous devriez maintenant pouvoir déplacer votre Sphère vers la gauche et la droite à l'aide de votre potentiomètre !

Mettre le bouton au travail

Maintenant que notre sphère bouge, ne serait-il pas bien d'avoir un moyen de ralentir un peu les choses lorsque nous sommes dans une situation difficile ? Nous allons utiliser notre bouton pour ralentir le temps dans notre jeu. Ouvrez votre script sphereMover et ajoutez ce code à votre fonction de mise à jour

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

Maintenant que nous avons la mécanique de notre jeu, ajoutons quelques obstacles ! Nous allons utiliser l'ennemi naturel de la sphère, le cube. Dans la hiérarchie, cliquez sur Créer > Objet 3D > Cube . Dans l'inspecteur du cube, Ajouter un composant > Physique > Rigidbody . Définissez la valeur Drag du rigidbody sur 5. De plus, sous le composant Box Collider dans l'inspecteur, sélectionnez Is Trigger. Cela nous permettra de détecter les collisions avec notre Sphère.

Créez un script sur le cube et appelez-le collisionAvecSphère , ouvrez le script et supprimez les fonctions Démarrer et Mettre à jour car nous n'en aurons pas besoin cette fois. Saisissez ce code :

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

OnTriggerEnter envoie un message chaque fois que le collisionneur de déclenchement frappe un autre collisionneur. Dans ce cas, nous lui disons de détruire tout ce qu'il touche. Enregistrez le script et revenez à l'éditeur Unity. Faites glisser le cube de la hiérarchie vers le panneau Projet. Vous remarquerez que le texte du cube dans la hiérarchie est devenu bleu. C'est parce que nous avons créé un préfabriqué et l'avons enregistré dans notre projet. Supprimez votre cube de la hiérarchie maintenant.

Tout ce dont nous avons besoin maintenant, c'est d'un script pour générer les cubes. Dans la hiérarchie, cliquez Créer > Créer vide , et renommez-le en Game Manager dans l'inspecteur et ajoutez-y un script appelé gameManager. Ouvrez le script et ajoutez ce code :

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; i {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

Enregistrez le script. De retour dans l'éditeur, sélectionnez le gestionnaire de jeu dans la hiérarchie et faites glisser votre préfabriqué de cube du panneau de projet vers la variable Cube dans l'inspecteur. Remplissez les valeurs pour votre frai ici aussi. Vous pouvez le manipuler pour le rendre aussi difficile ou facile que vous le souhaitez. Notez qu'il vaut la peine que vos cubes les plus bas apparaissent suffisamment haut pour permettre à Uniduino de s'initialiser - perdre la partie avant que vous ne puissiez vous déplacer peut être frustrant !

Le projet fini

Maintenant, lorsque vous appuyez sur play, les cubes apparaîtront au-dessus de vous et tomberont. Vous pouvez utiliser votre potentiomètre pour les éviter, et votre bouton pour ralentir le temps.

Dans ce projet, nous avons créé un contrôleur personnalisé avec un Arduino, configuré Unity et Uniduino pour communiquer avec lui, et créé un jeu simple pour le tester. Les concepts ici peuvent être appliqués à presque tous les projets, et il y a même jams de jeu qui se spécialisent dans les contrôleurs personnalisés .

Avec Arduino et Unity, vous pouvez créer un contrôleur personnalisé à partir de presque n'importe quoi. Avez-vous créé une chaîne hi-fi qui contrôle un vaisseau spatial ? Un grille-pain qui contrôle un jeu de plateforme ?

Si vous avez fait un projet comme celui-ci, je serais ravi de le voir! Postez-le dans les commentaires ci-dessous!

Partager Partager Tweeter E-mail 6 alternatives audibles : les meilleures applications de livres audio gratuites ou bon marché

Si vous n'avez pas envie de payer pour des livres audio, voici quelques excellentes applications qui vous permettent de les écouter gratuitement et légalement.

Lire la suite
Rubriques connexes
  • DIY
  • La programmation
  • Arduino
  • Une manette
  • Développement de jeu
A propos de l'auteur Ian Buckley(216 articles publiés)

Ian Buckley est un journaliste indépendant, musicien, interprète et producteur vidéo vivant à Berlin, en Allemagne. Quand il n'écrit pas ou sur scène, il bricole de l'électronique ou du code DIY dans l'espoir de devenir un savant fou.

Plus de Ian Buckley

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner
Catégorie Diy