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!

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

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 construire 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 pourriez utiliser l'une des nombreuses alternatives Arduino Guide d'achat: Quel conseil devriez-vous obtenir? Guide d'achat Arduino: Quel conseil devriez-vous obtenir? Il y a tellement de différents types de cartes Arduino là-bas, vous seriez pardonné d'être confus. Lequel devriez-vous acheter pour votre projet? Laissez-nous vous aider, avec ce guide d'achat Arduino! Lire la suite là-bas pour ce projet aussi. Nous allons également créer un jeu de base où vous utiliserez votre contrôleur pour éviter la chute d'objets et ralentir le temps.

Pour ce projet dont vous aurez besoin

  • Arduino ou un microcontrôleur similaire
  • Résistance 1 x 10k Ohm
  • 1 x interrupteur momentané
  • 1 x Potentiomètre
  • Câbles 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 choses sont disponibles dans un kit de démarrage Arduino. Si vous n'avez pas de kit de démarrage, consultez notre guide pour choisir les meilleurs 4 meilleurs kits de démarrage pour les débutants Arduino 4 meilleurs kits de démarrage pour les débutants Arduino Il existe de nombreux projets Arduino débutants que vous pouvez utiliser pour commencer, mais vous aurez besoin d'un Arduino et de quelques composants en premier. Voici notre sélection de 4 des meilleurs kits de démarrage pour ... Lisez-en plus un pour vous.

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 - parfait pour contrôler un jeu d'arcade simple.

Tableau de commande personnalisé 670

Assembler votre contrôleur

Configurez votre planche à pain et Arduino comme indiqué dans l'image ci-dessous. C'est ce que nous allons utiliser comme contrôleur de jeu, bien que vous puissiez utiliser presque exactement la même configuration qu'un contrôleur midi DIY Comment faire un contrôleur MIDI avec un Arduino Comment faire un contrôleur MIDI avec un Arduino En tant que musicien qui a amassé une collection d'instruments de musique et de boîtes de bruit, l'humble Arduino est l'outil parfait pour créer un contrôleur MIDI personnalisé. Lire la suite aussi!

Diagramme de Fritzing annoté

Préparation de votre Arduino

Une fois que vous avez tout câblé, connectez votre Arduino via USB. Dans l'IDE du logiciel Arduino, dirigez-vous vers Outils> Carte et Outils> Port pour sélectionner le microcontrôleur et le port que vous utilisez. L'IDE Arduino est livré avec l'esquisse 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 Premiers pas avec Arduino: Guide du débutant Premiers pas avec Arduino: Guide du débutant Arduino est une plate-forme de prototypage électronique open source basée sur un utiliser du matériel et des logiciels. Il est destiné aux artistes, designers, amateurs et toute personne intéressée par la création d'objets ou d'environnements interactifs. Lire la suite pour vous aider à bien parler avec votre ordinateur.

Configuration de votre projet Unity

Dans Unity, ouvrez Window> Asset Store pour accéder au magasin de ressources d'Unity depuis l'éditeur Unity. Rechercher dans le magasin d'actifs pour le plugin Uniduino. 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 l'écriture coûte 30 $. Il est possible de faire ce projet sans acheter le plugin, bien que ce soit plus compliqué et que vous puissiez trouver le plugin plus pratique.

Unity Asset Store Uniduino

Cette vidéo des créateurs du plugin vous guide tout au long du processus de test de tout ce qui fonctionne, ainsi que de la configuration initiale. 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 le bouton doivent afficher les valeurs à l'écran à côté de leurs numéros de broches maintenant. Le progrès!

Test Uniduino

Maintenant, pour faire quelque chose que nous pouvons contrôler

Nous avons donc un contrôleur, mais que devons-nous contrôler? 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 la configuration du jeu très rapidement, donc si vous êtes totalement nouveau dans le moteur Unity, vous pouvez trouver notre Unity Programmation d'un jeu avec l'unité: Guide d'un débutant Programmation d'un jeu avec l'unité: Guide du débutant Dans l'évolution paysage de développement de jeux indépendants, Unity a émergé comme quelque chose d'un standard de facto: son faible coût, sa facilité d'utilisation, et large ensemble de fonctionnalités le rendent idéal pour le développement rapide de jeux. Lire plus utile pour obtenir vos repères.

Nous allons construire un jeu très basique dans lequel votre objectif est d'esquiver votre sphère à gauche et à droite pour éviter les chutes de cubes, qui utiliseront votre nouveau contrôleur personnalisé.

Créez une nouvelle scène et faites glisser le préfabriqué Uniduino depuis Assets> Uniduino> Prefabs dans votre hiérarchie et faites glisser le préfabriqué Uniduino dans la hiérarchie. Nous en avons besoin ici pour parler entre notre jeu et notre contrôleur.

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.

Inspecteur Sphere X Position

Il est temps d'obtenir le codage

Maintenant, pour ajouter du code à cette fête. Avec la sphère sélectionnée dans la hiérarchie, cliquez sur Ajouter un composant> Nouveau script en bas de la fenêtre de l'inspecteur. Nommez-le sphereMover et sélectionnez C Sharp dans le menu déroulant. Cliquez sur Créer et ajouter et le script sera ajouté à 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é certaines variables pour notre Arduino, ses broches et notre Sphère. Nous avons également utilisé le
Démarrez et ConfigurePins méthodes pour initialiser notre Arduino au moment de l'exécution. Permet de sauvegarder notre script, et revenons dans l'éditeur Unity pour voir ce qui a changé.

Script Sphère Mover avec des variables vides

Nous pouvons maintenant voir nos variables publiques dans la fenêtre Inspecteur. Voyons voir ce que nous pouvons entrer à ce stade pour nous aider plus tard. Nous savons quelle broche nous utilisons sur l'Arduino à partir de notre build plus tôt, nous pouvons les entrer. Nous savons également, grâce à notre expérience, jusqu'où nous voulons que notre sphère puisse voyager à gauche et à droite afin qu'elle ne tombe pas de l'écran. Permet d'entrer ces valeurs maintenant.

Script Sphère Mover avec des variables

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 Update de notre script sphereMover, et sauvegarder à 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 l'inspecteur Unity. Avant de faire un test, c'est le bon moment pour vérifier que le plug-in Uniduino écoute sur le bon port. Cliquez sur Uniduino dans la hiérarchie et vérifiez son nom dans l'inspecteur. S'il est vide, remplissez le bon numéro de port pour votre Arduino. Dans ce cas, c'était COM4, ​​bien que cela puisse être différent pour vous. Vérifiez en utilisant l'IDE Arduino si vous n'êtes pas sûr.

Le port de vérification Uniduino est correct

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.

Signes de vie 2

Maintenant nous parlons! Eh bien, à proprement parler, Unity et l'Arduino parlent, mais qui compte? Si vous en êtes arrivé là et que vous ne voyez pas la valeur changer dans l'inspecteur, vérifiez les étapes de configuration et assurez-vous que vous avez sélectionné le bon port 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 de l'espace vectoriel, déterminé par les valeurs de son Transform.position. Dans l'image ci-dessous, où la sphère est au point le plus à gauche, nous le voulons, vous pouvez voir que son vecteur de position est 9.5, -4, 0.

Transformer l'exemple 670

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

Pourquoi faire des maths quand l'unité le fera pour vous?

Pour ceux d'entre vous qui redoutent de regarder un bout de papier couvert de chiffres absurdes (bien qu'il existe de super sites Web. Les 20 sites Web que vous devez apprendre les mathématiques étape par étape Les 20 sites Web que vous devez apprendre Mathématiques étape par étape Nous avons compilé meilleurs sites pour chaque niveau afin que vous puissiez apprendre de manière systématique, acquérir une meilleure compréhension des mathématiques un niveau à la fois, et amusez-vous! Lire la suite qui peut vous aider à apprendre les mathématiques), ne craignez pas. 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 une 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 les uns aux autres, prêts à être utilisés dans notre script sphereMover . 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; } } 

Sauvegardez 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:

Remapper la fonction

L'invite nous montre que notre Remap prend deux ensembles de valeurs From et To, et les mappe ensemble. Nous pouvons entrer nos valeurs dans ceci.

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

Sauvegardez votre script, revenez à l'éditeur Unity et cliquez sur le bouton de lecture. Vous devriez maintenant voir que la variable Pot Mapped 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.

Pot mappé

Remarque: si vous remarquez que vos valeurs sont inversées, alors lorsque votre potentiomètre est complètement à droite, vous obtenez une valeur négative pour votre variable Pot Mapped, vous pouvez avoir votre potentiomètre mis en place dans le mauvais sens. Heureusement, vous pouvez résoudre ce problème sans faire de recâblage. Vous pouvez simplement changer les valeurs lorsque vous les remappez:

Switch Remap

Maintenant nous avons enfin des valeurs utilisables. Maintenant tout ce qui reste à faire est d'assigner ces valeurs à la position X de notre sphère:

 //Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z); 

Sauvegardez votre script, revenez à l'éditeur Unity et appuyez sur play. Vous devriez maintenant pouvoir déplacer votre Sphère à gauche et à droite en utilisant votre potentiomètre!

Mettre le bouton au travail

Maintenant que nous avons notre sphère en mouvement, ne serait-il pas agréable 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 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 corps rigide sur 5. En outre, sous le composant Box Collider de 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 collideWithSphere, ouvrez le script et supprimez les fonctions Start et Update car nous n'en aurons plus besoin cette fois. Entrez 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éclenchements frappe un autre collisionneur. Dans ce cas, nous lui disons de détruire tout ce qu'il touche. Sauvegardez 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 sauvegardé dans notre projet. Supprimez votre cube de la hiérarchie maintenant.

Tout ce dont nous avons besoin maintenant est un script pour engendrer les cubes. Dans la hiérarchie, cliquez sur Créer> Créer vide, puis renommez-le en gestionnaire de jeux dans l'inspecteur et ajoutez-lui 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< numberToSpwan; i++) { Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity); } } // Update is called once per frame void Update () { } } 

Sauvegardez 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 jouer avec pour le rendre aussi dur ou facile que vous le souhaitez. Notez que cela vaut la peine que vos cubes les plus bas apparaissent assez haut pour permettre à Uniduino de s'initialiser - perdre la partie avant que vous soyez capable de bouger peut être frustrant!

Gestionnaire de jeu

Le projet fini

Maintenant, quand 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 n'importe quel projet, et il y a même des confitures 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 tout. 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, j'aimerais le voir! Postez-le dans les commentaires ci-dessous!

In this article