Πώς να φτιάξετε έναν προσαρμοσμένο ελεγκτή παιχνιδιών με Arduino και Unity

Πώς να φτιάξετε έναν προσαρμοσμένο ελεγκτή παιχνιδιών με Arduino και Unity

Θέλατε ποτέ να σχεδιάσετε το δικό σας ελεγκτή παιχνιδιών; Είναι πιο εύκολο από όσο νομίζετε!





Σε αυτό το σύντομο έργο θα δημιουργήσουμε ένα απλό προσαρμοσμένο χειριστήριο παιχνιδιών για χρήση με τη μηχανή παιχνιδιών Unity. Αυτός ο ελεγκτής θα τροφοδοτείται από ένα Arduino Uno, αν και θα μπορούσατε να χρησιμοποιήσετε μία από τις πολλές εναλλακτικές λύσεις για αυτό το έργο επίσης. Θα δημιουργήσουμε επίσης ένα βασικό παιχνίδι όπου θα χρησιμοποιήσετε το χειριστήριο για να αποφύγετε την πτώση αντικειμένων και να επιβραδύνετε το χρόνο.





Για αυτό το έργο θα χρειαστείτε

  • Arduino ή παρόμοιος μικροελεγκτής
  • Αντίσταση 1 x 10k Ohm
  • 1 x Στιγμιαίο διακόπτη
  • 1 x Ποτενσιόμετρο
  • Σύρματα σύνδεσης
  • Μια σανίδα ψωμιού
  • Μηχανή παιχνιδιού Unity
  • Το πρόσθετο Uniduino από το Unity Asset Store ($ 30)
  • Ολοκληρώστε τον κώδικα έργου, σε περίπτωση που δεν θέλετε να τον γράψετε (δεν περιλαμβάνει το πρόσθετο Uniduino)

Τα περισσότερα από αυτά είναι διαθέσιμα σε ένα κιτ εκκίνησης Arduino. Αν δεν έχετε ένα κιτ εκκίνησης, ανατρέξτε στον οδηγό μας για να επιλέξετε το καλύτερο για εσάς.





Μπορείτε να κάνετε το χειριστήριό σας όσο πιο περίπλοκο θέλετε, αν και για αυτό το παράδειγμα θα δημιουργήσουμε ένα ποτενσιόμετρο και ένα κουμπί - ιδανικό για τον έλεγχο ενός απλού arcade παιχνιδιού.

Συναρμολόγηση του ελεγκτή σας

Ρυθμίστε το breadboard και το Arduino όπως φαίνεται στην παρακάτω εικόνα. Αυτό θα χρησιμοποιήσουμε ως ελεγκτής παιχνιδιού, αν και θα μπορούσατε να χρησιμοποιήσετε σχεδόν την ίδια ακριβώς ρύθμιση με ένα DIY χειριστήριο midi πολύ!



Προετοιμασία του Arduino σας

Μόλις τα συνδέσετε όλα, συνδέστε το Arduino μέσω USB. Στο Arduino Software IDE κατευθυνθείτε προς Εργαλεία> Πίνακας και Εργαλεία> Θύρα για να επιλέξετε ποιον μικροελεγκτή και θύρα χρησιμοποιείτε. Το Arduino IDE συνοδεύεται από το σκίτσο που χρειαζόμαστε και μπορείτε να το βρείτε κάτω Αρχείο> Παραδείγματα> Firmata> StandardFirmata Το Κάντε κλικ στο κουμπί Μεταφόρτωση και θα είστε έτοιμοι να ξεκινήσετε.

Εάν είστε νέοι στο Arduino και το κεφάλι σας λιώνει ελαφρώς, ελέγξτε το δικό μας Οδηγός για αρχάριους για να σας βοηθήσει να μιλήσετε όμορφα με τον υπολογιστή σας.





Ρύθμιση του έργου σας για την ενότητα

Στο Unity, ανοίξτε Παράθυρο> Κατάστημα περιουσιακών στοιχείων για πρόσβαση στο Unity's Asset Store μέσα από το Unity Editor. Αναζητήστε στο Asset Store την προσθήκη Uniduino. Αυτό το πρόσθετο θα σας επιτρέψει να λαμβάνετε και να στέλνετε δεδομένα προς και από τις καρφίτσες σας στο Arduino εντός της Unity. Το πρόσθετο κατά τη στιγμή της γραφής κοστίζει $ 30. Είναι δυνατόν για να κάνετε αυτό το έργο χωρίς να αγοράσετε το plugin, αν και είναι μάλλον πιο περίπλοκο και μπορεί να βρείτε το plugin πιο βολικό παντού.

Αυτό το βίντεο από τους δημιουργούς της προσθήκης σας οδηγεί στη διαδικασία δοκιμής ότι όλα λειτουργούν, μαζί με την πρώτη εγκατάσταση. Λάβετε υπόψη ότι ίσως χρειαστεί να επαναφέρετε τον επεξεργαστή Unity στα Windows.





Μπορούμε να χρησιμοποιήσουμε τον ίδιο πίνακα δοκιμών για να δοκιμάσουμε τον ελεγκτή μας. Ορίστε το pin D2 σε INPUT και Digital. Πιο κάτω, ορίστε το pin A5 στο ANALOG. Το ποτενσιόμετρο και το κουμπί σας θα πρέπει να εμφανίζουν τιμές στην οθόνη δίπλα στους αριθμούς PIN τους. Πρόοδος!

Τώρα για να κάνουμε κάτι που μπορούμε να ελέγξουμε

Έχουμε λοιπόν έναν ελεγκτή, αλλά τι πρέπει να ελέγξουμε; Λοιπόν, οι δυνατότητες είναι ατελείωτες, αλλά για σήμερα θα δημιουργήσουμε ένα πολύ απλό παιχνίδι αποφυγής για να δοκιμάσουμε το νέο μας σύστημα ελέγχου. Θα περάσουμε πολύ γρήγορα από τη ρύθμιση του παιχνιδιού, οπότε αν είστε εντελώς νέοι στον κινητήρα Unity, ίσως βρείτε το δικό μας Οδηγός για αρχάριους για προγραμματισμό παιχνιδιών Unity χρήσιμο για να αποκτήσετε τον προσανατολισμό σας.

Θα δημιουργήσουμε ένα πολύ βασικό παιχνίδι στο οποίο ο στόχος σας είναι να αποφύγετε τη σφαίρα σας προς τα αριστερά και τα δεξιά για να αποφύγετε την πτώση των κύβων, τα οποία θα χρησιμοποιήσουν τον πρόσφατα κατασκευασμένο προσαρμοσμένο ελεγκτή σας.

Δημιουργήστε μια νέα σκηνή και σύρετε το πρότυπο Uniduino από Στοιχεία> Uniduino> Προκατασκευές στην ιεραρχία σας και σύρετε το πρότυπο Uniduino στην ιεραρχία. Το χρειαζόμαστε εκεί για να μιλήσουμε μεταξύ του παιχνιδιού και του χειριστή μας.

Στην ιεραρχία Unity κάντε κλικ Δημιουργία> Σφαίρα και χρησιμοποιήστε την καρτέλα Μετασχηματισμός στον Επιθεωρητή για να τη μετακινήσετε στο κάτω μέρος της οθόνης του παιχνιδιού.

It'sρθε η ώρα να λάβετε κωδικοποίηση

Τώρα για να προσθέσετε κάποιο κώδικα σε αυτό το μέρος. Με την σφαίρα επιλεγμένη στην Ιεραρχία, κάντε κλικ Προσθήκη στοιχείου> Νέο σενάριο στο κάτω μέρος του παραθύρου Inspector. Ονόμασέ το σφαίραMover και επιλέξτε C Sharp από το αναπτυσσόμενο μενού. Κάντε κλικ Δημιουργία και προσθήκη και το σενάριο θα προστεθεί στο GameObject. Κάντε διπλό κλικ σε αυτό για να ανοίξετε το σενάριο και εισαγάγετε αυτόν τον κωδικό:

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);
}
}

Αφιερώστε λίγο χρόνο για να διαβάσετε τα σχόλια του κώδικα. Μέχρι στιγμής, έχουμε δηλώσει ορισμένες μεταβλητές για το Arduino, τις καρφίτσες και τη σφαίρα μας. Έχουμε επίσης χρησιμοποιήσει το

Μέθοδοι Start and ConfigurePins για την προετοιμασία του Arduino κατά την εκτέλεση. Ας αποθηκεύσουμε το σενάριό μας και επιστρέφουμε στον επεξεργαστή Unity και βλέπουμε τι έχει αλλάξει.

Τώρα μπορούμε να δούμε τις δημόσιες μεταβλητές μας στο παράθυρο Inspector. Ας δούμε τι μπορούμε να εισάγουμε σε αυτό το στάδιο για να μας βοηθήσουμε αργότερα. Γνωρίζουμε τι καρφίτσες χρησιμοποιούμε στο Arduino από την κατασκευή μας νωρίτερα, μπορούμε να τις εισάγουμε. Γνωρίζουμε επίσης από το προηγούμενο πείραμά μας πόσο μακριά θέλουμε η σφαίρα μας να μπορεί να ταξιδεύει αριστερά και δεξιά, ώστε να μην πέσει από την οθόνη. Ας εισαγάγουμε αυτές τις τιμές τώρα.

Πρώτα σημάδια ζωής

It'sρθε η ώρα να δούμε πραγματικά τιμές από το Arduino μέσα στο Unity Editor. Προς το παρόν, μπορούμε να προσθέσουμε μία γραμμή κώδικα στη συνάρτηση Update του scriptMoverMover και να αποθηκεύσουμε ξανά το σενάριο.

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

Τώρα που η μεταβλητή potValue ενημερώνεται σε κάθε καρέ, μπορούμε να δούμε την αξία της σε πραγματικό χρόνο στο Unity Inspector. Πριν του δώσουμε μια δοκιμή, τώρα θα ήταν μια καλή στιγμή για να ελέγξουμε ότι η πρίζα Uniduino ακούει στη σωστή θύρα. Κάντε κλικ στο Uniduino στο Heirarchy και ελέγξτε το Όνομα θύρας στο Inspector. Εάν είναι κενό, συμπληρώστε τον σωστό αριθμό θύρας για το Arduino σας. Σε αυτή την περίπτωση ήταν COM4, ​​αν και μπορεί να είναι διαφορετικό για εσάς. Ελέγξτε χρησιμοποιώντας το Arduino IDE εάν δεν είστε σίγουροι.

Επιλέξτε τη σφαίρα σας στην ιεραρχία και κάντε κλικ στο κουμπί Αναπαραγωγή στο επάνω μέρος της οθόνης. Το σύστημα χρειάζεται μερικά δευτερόλεπτα για να προετοιμαστεί, μετά από το οποίο θα πρέπει να αρχίσετε να βλέπετε τη μεταβλητή Pot Value να αλλάζει στον επιθεωρητή όταν μετακινείτε το ποτενσιόμετρο.

Τώρα μιλάμε! Λοιπόν, αυστηρά μιλώντας η Unity και το Arduino μιλούν, αλλά ποιος μετράει; Εάν έχετε φτάσει μέχρι εδώ και δεν βλέπετε την αλλαγή της αξίας στον επιθεωρητή, ελέγξτε τα βήματα ρύθμισης και βεβαιωθείτε ότι έχετε επιλέξει τη σωστή θύρα για το Arduino σας.

Ας Μετακινήσουμε Αυτή τη Σφαίρα

Τώρα που έχουμε έξω τη μεταβλητή potValue που ενημερώνεται, θέλουμε να χρησιμοποιήσουμε αυτήν την τιμή για να μετακινήσουμε τη σφαίρα μας. Όταν το ποτενσιόμετρο είναι εντελώς αριστερά, θέλουμε η σφαίρα να βρίσκεται στην αριστερή πλευρά της οθόνης και αντίστροφα. Τα αντικείμενα στην ενότητα τοποθετούνται σε ένα σημείο του διανυσματικού χώρου, που καθορίζονται από τις τιμές του Transform.position Το Στην παρακάτω εικόνα, όπου η σφαίρα βρίσκεται στο πιο απομακρυσμένο σημείο προς τα αριστερά που θα θέλαμε, μπορείτε να δείτε ότι το διάνυσμα θέσης είναι 9,5, -4, 0.

Θέλουμε να επηρεάσουμε τη θέση Χ της σφαίρας. Δυστυχώς, η άμεση χρήση των τιμών από το ποτενσιόμετρό μας δεν θα λειτουργήσει, καθώς όταν το ποτενσιόμετρο είναι εντελώς αριστερά δίνει μια τιμή 0 - που θα έβαζε τη σφαίρα μας ακριβώς στη μέση της οθόνης. Στο άλλο άκρο, η κορυφαία τιμή του ποτενσιόμετρου, 1023, θα τοποθετούσε τον κύβο προς τα δεξιά της οθόνης μας. Οχι χρήσιμο. Αυτό που χρειαζόμαστε εδώ είναι κάποια μαθηματικά.

Γιατί να κάνετε μαθηματικά όταν η ενότητα θα το κάνει για εσάς;

Για εσάς εκεί έξω που φοβάστε να κοιτάξετε ένα κομμάτι χαρτί καλυμμένο με ανούσιους αριθμούς (αν και υπάρχουν μερικοί υπέροχοι ιστότοποι που μπορεί να σας βοηθήσει να μάθετε Μαθηματικά), μην φοβάστε. Χρειαζόμαστε έναν τρόπο να κάνουμε τις τιμές του ποτενσιόμετρου μας να αντιστοιχούν στη θέση Χ της σφαίρας μας. Ευτυχώς, μπορούμε να χρησιμοποιήσουμε ένα Μέθοδος επέκτασης Το

Μια μέθοδος επέκτασης είναι ένα σενάριο που κάνει μια συγκεκριμένη δουλειά για εμάς. Σε αυτήν την περίπτωση, του δίνουμε τις τιμές που έχουμε και τις επιστρέφει αντιστοιχισμένες μεταξύ τους, έτοιμες να χρησιμοποιηθούν σφαίραMover γραφή. Στο επάνω μέρος του πίνακα Έργου, κάντε κλικ Δημιουργία> C# Script και ονομάστε το ExtensionMethods. Εισαγάγετε τον παρακάτω κωδικό στο σενάριο:

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;
}
}

Αποθηκεύστε το σενάριο και επιστρέψτε στο σενάριο σφαίρας σας. Τώρα μπορούμε να χρησιμοποιήσουμε αυτήν τη συνάρτηση Remap στο σενάριο ExtensionMethods στη συνάρτηση Update για να μετατρέψουμε τις τιμές του ποτενσιόμετρου σε χρήσιμες τιμές στο παιχνίδι μας. Κάτω από το σημείο που μόλις εκχωρήσαμε τη μεταβλητή potValue, πληκτρολογήστε τα εξής:

Η προτροπή μας δείχνει ότι το Remap μας παίρνει δύο σύνολα τιμών από και προς και, και τις χαρτογραφεί μαζί. Μπορούμε να εισάγουμε τις αξίες μας σε αυτό.

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

Αποθηκεύστε το σενάριό σας, επιστρέψτε στον επεξεργαστή Unity και πατήστε το κουμπί αναπαραγωγής. Θα πρέπει τώρα να δείτε ότι η μεταβλητή Mapped Pot αλλάζει όταν μετακινείτε το ποτενσιόμετρο, για να αντιστοιχεί στις τιμές που καθορίσαμε για την Αριστερή και τη Δεξιά πλευρά μας. Αφιερώστε λίγο χρόνο για να καθίσετε και να ευχαριστήσετε το σενάριο ExtensionMethods. Δεν είναι αριθμομηχανή στο προσκήνιο.

Σημείωση: εάν παρατηρείτε ότι οι τιμές σας αντιστρέφονται, οπότε όταν το ποτενσιόμετρο σας είναι μέχρι τα δεξιά, λαμβάνετε αρνητική τιμή για τη μεταβλητή Mapped Pot, ενδέχεται να έχετε ρυθμίσει το ποτενσιόμετρό σας με λάθος τρόπο. Ευτυχώς, μπορείτε να το διορθώσετε χωρίς να επανασυνδέσετε. Μπορείτε απλά να αλλάξετε τις τιμές όταν τις επανασχεδιάσετε:

Τώρα έχουμε επιτέλους αξιοποιήσιμες αξίες. Τώρα το μόνο που μένει να κάνουμε είναι να αντιστοιχίσουμε αυτές τις τιμές στη θέση Χ της σφαίρας μας:

πώς να απενεργοποιήσετε τον χρόνο οθόνης
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Αποθηκεύστε το σενάριό σας, επιστρέψτε στον επεξεργαστή Unity και πατήστε play. Θα πρέπει τώρα να μπορείτε να μετακινήσετε τη Σφαίρα σας αριστερά και δεξιά χρησιμοποιώντας το ποτενσιόμετρο σας!

Θέτοντας το κουμπί σε λειτουργία

Τώρα που έχουμε τη σφαίρα μας σε κίνηση, δεν θα ήταν ωραίο να έχουμε έναν τρόπο να επιβραδύνουμε λίγο τα πράγματα όταν βρεθούμε σε ένα στενό σημείο; Θα χρησιμοποιήσουμε το κουμπί μας για να επιβραδύνουμε το χρόνο στο παιχνίδι μας. Ανοίξτε το σενάριο sphereMover και προσθέστε αυτόν τον κώδικα στη συνάρτηση Ενημέρωση

//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;

Τώρα έχουμε τους μηχανικούς του παιχνιδιού μας, ας προσθέσουμε κάποια εμπόδια! Θα χρησιμοποιήσουμε τον φυσικό εχθρό της σφαίρας, τον κύβο. Στην ιεραρχία, κάντε κλικ Δημιουργία> 3d Object> Cube Το Στον επιθεωρητή του κύβου, Προσθήκη εξαρτήματος> Φυσική> Rigidbody Το Ορίστε την τιμή Drag του άκαμπτου σώματος σε 5. Επίσης, κάτω από το στοιχείο Box Collider στον επιθεωρητή, επιλέξτε Is Trigger. Αυτό θα μας επιτρέψει να ανιχνεύσουμε συγκρούσεις με τη Σφαίρα μας.

Δημιουργήστε ένα σενάριο στον κύβο και καλέστε το collideWithSphere , ανοίξτε το σενάριο και διαγράψτε τις λειτουργίες Έναρξη και Ενημέρωση καθώς δεν θα τις χρειαζόμαστε αυτήν τη φορά. Εισαγάγετε αυτόν τον κωδικό:

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

Το OnTriggerEnter στέλνει ένα μήνυμα κάθε φορά που η σύγκρουση σκανδάλης χτυπά έναν άλλο συγκρούτη. Σε αυτήν την περίπτωση, του λέμε να καταστρέψει ό, τι αγγίζει. Αποθηκεύστε το σενάριο και επιστρέψτε στον επεξεργαστή Unity. Σύρετε τον κύβο από την ιεραρχία στον πίνακα έργου. Θα παρατηρήσετε ότι το κείμενο του κύβου στην ιεραρχία έχει γίνει μπλε. Αυτό οφείλεται στο ότι δημιουργήσαμε ένα prefab και το αποθηκεύσαμε στο έργο μας. Διαγράψτε τον κύβο σας από την ιεραρχία τώρα.

Το μόνο που χρειαζόμαστε τώρα είναι ένα σενάριο για την αναπαραγωγή των κύβων. Στην ιεραρχία κάντε κλικ Δημιουργία> Δημιουργία Άδειου , και μετονομάστε το σε Game Manager στο Inspector και προσθέστε ένα σενάριο σε αυτό που ονομάζεται gameManager. Ανοίξτε το σενάριο και προσθέστε αυτόν τον κωδικό:

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 ()
{

}
}

Αποθηκεύστε το σενάριο. Επιστρέψτε στο πρόγραμμα επεξεργασίας, επιλέξτε το Game Manager στην ιεραρχία και σύρετε το πρότυπο κύβων από τον πίνακα έργου στη μεταβλητή Cube στο Inspector. Συμπληρώστε και εδώ τις τιμές για την αναπαραγωγή σας. Μπορείτε να το παλέψετε για να το κάνετε όσο πιο δύσκολο ή εύκολο θέλετε. Σημειώστε ότι αξίζει να έχετε τους χαμηλότερους κύβους σας να αναπαραχθούν αρκετά ψηλά για να επιτρέψετε στο Uniduino να αρχικοποιήσει - η απώλεια του παιχνιδιού πριν μπορέσετε να μετακινηθείτε μπορεί να είναι απογοητευτικό!

Το Ολοκληρωμένο Έργο

Τώρα, όταν πατάτε το παιχνίδι, οι κύβοι θα γεννηθούν πάνω σας και θα πέσουν. Μπορείτε να χρησιμοποιήσετε το ποτενσιόμετρο για να τα αποφύγετε και το κουμπί σας για να επιβραδύνετε το χρόνο.

Σε αυτό το έργο δημιουργήσαμε ένα προσαρμοσμένο χειριστήριο με ένα Arduino, ρυθμίσαμε τις παραμέτρους Unity και Uniduino για να επικοινωνούν μαζί του και δημιουργήσαμε ένα απλό παιχνίδι για να το δοκιμάσουμε. Οι έννοιες εδώ μπορούν να εφαρμοστούν σε σχεδόν οποιοδήποτε έργο και υπάρχουν ακόμη εμπλοκές παιχνιδιών που ειδικεύονται σε προσαρμοσμένους ελεγκτές Το

Με το Arduino και την Unity θα μπορούσατε να δημιουργήσετε ένα προσαρμοσμένο χειριστήριο από σχεδόν οτιδήποτε. Έχετε δημιουργήσει ένα hi-fi που ελέγχει ένα διαστημόπλοιο; Μια τοστιέρα που ελέγχει ένα παιχνίδι πλατφόρμας;

Αν έχετε κάνει ένα τέτοιο έργο θα ήθελα πολύ να το δω! Δημοσίευσε το στα σχόλια παρακάτω!

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ 6 Ακουστικές εναλλακτικές λύσεις: Οι καλύτερες δωρεάν ή φτηνές εφαρμογές ηχητικών βιβλίων

Εάν δεν θέλετε να πληρώνετε για ηχητικά βιβλία, εδώ είναι μερικές εξαιρετικές εφαρμογές που σας επιτρέπουν να τα ακούτε δωρεάν και νόμιμα.

Διαβάστε Επόμενο
Σχετικά θέματα
  • DIY
  • Προγραμματισμός
  • Arduino
  • Ελεγκτής παιχνιδιών
  • Ανάπτυξη παιχνιδιών
Σχετικά με τον Συγγραφέα Ο anαν Μπάκλεϊ(216 δημοσιευμένα άρθρα)

Ο Ian Buckley είναι ανεξάρτητος δημοσιογράφος, μουσικός, ερμηνευτής και παραγωγός βίντεο που ζει στο Βερολίνο της Γερμανίας. Όταν δεν γράφει ούτε είναι στη σκηνή, ασχολείται με ηλεκτρονικά ή κώδικα DIY με την ελπίδα να γίνει τρελός επιστήμονας.

Περισσότερα από τον Ian Buckley

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή
Κατηγορία Diy