Cara Membuat Pengontrol Game Kustom Dengan Arduino dan Unity

Cara Membuat Pengontrol Game Kustom Dengan Arduino dan Unity

Pernahkah Anda ingin mendesain pengontrol game Anda sendiri? Ini lebih mudah dari yang Anda pikirkan!





Dalam proyek singkat ini, kami akan membuat pengontrol permainan kustom sederhana untuk digunakan dengan mesin permainan Unity. Pengontrol ini akan ditenagai oleh Arduino Uno, meskipun Anda juga dapat menggunakan salah satu dari banyak alternatif di luar sana untuk proyek ini. Kami juga akan membuat permainan dasar di mana Anda akan menggunakan pengontrol Anda untuk menghindari benda jatuh dan memperlambat waktu.





Untuk Proyek Ini Anda Akan Membutuhkan

  • Arduino atau mikrokontroler serupa
  • 1x10k Ohm resistor
  • 1 x Saklar sesaat
  • 1 x Potensiometer
  • Kabel penghubung
  • Papan tempat memotong roti
  • Mesin permainan persatuan
  • Plugin Uniduino dari Unity Asset Store ()
  • Lengkapi kode proyek, jika Anda tidak ingin menuliskannya (tidak termasuk plugin Uniduino)

Sebagian besar dari hal-hal ini tersedia dalam starter kit Arduino. Jika belum memiliki starter kit, lihat panduan kami untuk memilih yang terbaik untuk Anda.





Anda dapat membuat pengontrol Anda serumit yang Anda inginkan, meskipun untuk contoh ini kami akan menyiapkan potensiometer dan tombol - sempurna untuk mengendalikan permainan arcade sederhana.

Merakit Pengontrol Anda

Siapkan papan tempat memotong roti dan Arduino Anda seperti yang ditunjukkan pada gambar di bawah ini. Inilah yang akan kami gunakan sebagai pengontrol game kami, meskipun Anda dapat menggunakan pengaturan yang hampir sama persis seperti a Pengontrol midi DIY juga!



Mempersiapkan Arduino Anda

Setelah semuanya terhubung, sambungkan Arduino Anda melalui USB. Di Arduino Software IDE, buka Alat > Papan dan Alat > Pelabuhan untuk memilih mikrokontroler dan port yang Anda gunakan. Arduino IDE hadir dibundel dengan sketsa yang kami butuhkan, dan Anda dapat menemukannya di bawah File> Contoh> Firma> StandarFirmata . Klik Unggah dan Anda akan siap untuk pergi.

Jika Anda baru mengenal Arduino dan kepala Anda sedikit meleleh, lihat kami Panduan Pemula untuk membantu Anda membuatnya berbicara dengan komputer Anda dengan baik.





Menyiapkan Proyek Persatuan Anda

Di Unity, buka Jendela > Toko Aset untuk mengakses Toko Aset Unity dari dalam Editor Unity. Cari di Toko Aset untuk plugin Uniduino. Plugin ini akan memungkinkan Anda untuk menerima dan mengirim data ke dan dari pin Arduino Anda di dalam Unity. Plugin pada saat penulisan ini berharga . Itu mungkin untuk melakukan proyek ini tanpa membeli plugin, meskipun agak lebih rumit dan Anda mungkin menemukan plugin lebih nyaman secara keseluruhan.

Video dari pembuat plugin ini membawa Anda melalui proses pengujian semuanya berfungsi, bersama dengan pengaturan pertama kali. Perhatikan bahwa Anda mungkin juga harus mengatur ulang editor Unity di Windows.





Kami dapat menggunakan panel uji yang sama ini untuk menguji pengontrol kami. Atur Pin D2 ke INPUT dan Digital. Lebih jauh ke bawah, atur Pin A5 ke ANALOG. Potensiometer dan tombol Anda akan menampilkan nilai di layar di sebelah nomor pinnya sekarang. Kemajuan!

Sekarang untuk Membuat Sesuatu yang Dapat Kita Kendalikan

Jadi kita punya pengontrol, tapi apa yang harus kita kendalikan? Yah, kemungkinannya tidak terbatas, tetapi untuk hari ini kita akan membuat game menghindar yang sangat sederhana untuk menguji sistem kontrol baru kita. Kami akan memindahkan pengaturan game dengan cukup cepat, jadi jika Anda benar-benar baru di mesin Unity, Anda dapat menemukan kami Panduan Pemula Pemrograman Game Unity berguna untuk mendapatkan bantalan Anda.

Kami akan membangun permainan yang sangat mendasar di mana tujuan Anda adalah untuk menghindari bola Anda ke kiri dan kanan untuk menghindari batu yang jatuh, yang akan menggunakan pengontrol khusus yang baru Anda buat.

Buat adegan baru dan seret cetakan Uniduino dari Aset > Uniduino > Prefab ke dalam hierarki Anda dan seret cetakan Uniduino ke dalam hierarki. Kami membutuhkannya di sana untuk melakukan pembicaraan antara game dan pengontrol kami.

Dalam hierarki Unity, klik Buat > Bola dan gunakan tab Transform di Inspector untuk memindahkannya ke bagian bawah layar game.

Saatnya Mendapatkan Coding

Sekarang untuk menambahkan beberapa kode ke pesta ini. Dengan bola yang dipilih dalam Hirarki, klik Tambahkan Komponen > Skrip Baru di bagian bawah jendela Inspektur itu. Sebut saja bolaPenggerak dan pilih C tajam dari menu tarik-turun. Klik Buat dan Tambahkan dan skrip akan ditambahkan ke GameObject. Klik dua kali untuk membuka skrip dan masukkan kode ini:

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

Luangkan waktu sejenak untuk membaca komentar kode. Sejauh ini, kami telah mendeklarasikan beberapa variabel untuk Arduino kami, pinnya, dan Sphere kami. Kami juga telah menggunakan

Metode Start dan ConfigurePins untuk menginisialisasi Arduino kami pada saat run time. Mari simpan skrip kita, dan kembali ke editor Unity dan lihat apa yang berubah.

Kita sekarang dapat melihat variabel publik kita di jendela Inspector. Mari kita lihat apa yang bisa kita masukkan pada tahap ini untuk membantu kita nanti. Kami tahu pin apa yang kami gunakan di Arduino dari build kami sebelumnya, kami bisa memasukkannya. Kita juga mengetahui dari percobaan kita sebelumnya seberapa jauh kita ingin bola kita dapat bergerak ke kiri dan ke kanan sehingga tidak jatuh dari layar. Mari masukkan nilai-nilai ini sekarang.

Tanda-tanda Kehidupan Pertama

Saatnya untuk benar-benar melihat nilai dari Arduino kita di dalam Unity Editor. Untuk saat ini, kita dapat menambahkan satu baris kode ke fungsi Update skrip sphereMover kita, dan menyimpan skrip lagi.

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

Sekarang setelah variabel potValue kami diperbarui setiap frame, kami dapat melihat nilainya secara real time di Unity Inspector. Sebelum kita mengujinya, sekarang adalah saat yang tepat untuk memeriksa apakah plug-in Uniduino mendengarkan di port yang benar. Klik Uniduino di Heirarchy, dan periksa Port Name di Inspector. Jika kosong, isikan nomor port yang benar untuk Arduino Anda. Dalam hal ini adalah COM4, ​​meskipun mungkin berbeda untuk Anda. Periksa menggunakan Arduino IDE jika Anda tidak yakin.

Pilih bola Anda dalam hierarki dan klik tombol Putar di bagian atas layar. Sistem perlu beberapa detik untuk inisialisasi, setelah itu Anda akan mulai melihat variabel Nilai Pot berubah di inspektur saat Anda menggerakkan potensiometer.

Sekarang kita bicara! Nah, sebenarnya Unity dan Arduino sedang berbicara, tapi siapa yang menghitung? Jika Anda sudah sejauh ini dan tidak melihat perubahan nilai di inspektur, periksa langkah-langkah penyiapan, dan pastikan Anda memilih Port yang benar untuk Arduino Anda.

Ayo Pindahkan Bola Ini

Sekarang kita memiliki variabel potValue yang sedang diperbarui, kita ingin menggunakan nilai ini untuk memindahkan bola kita. Ketika potensiometer bergerak ke kiri, kami ingin bola berada di sisi kiri layar, dan sebaliknya. Objek dalam Unity diposisikan pada suatu titik dalam ruang Vektor, ditentukan oleh nilai-nilainya Transform.posisi . Pada gambar di bawah, di mana bola berada pada titik terjauh ke kiri yang kita inginkan, Anda dapat melihat bahwa vektor posisinya adalah 9,5, -4, 0.

Kami ingin mempengaruhi posisi X bola. Sayangnya menggunakan nilai dari potensiometer kami secara langsung tidak akan berfungsi, karena ketika potensiometer mengarah ke kiri, ia memberikan nilai 0 -- yang akan menempatkan bola kami tepat di tengah layar. Di sisi lain, nilai tertinggi potensiometer, 1023, akan menempatkan kubus jauh di sebelah kanan layar kita. Tidak berguna. Apa yang kita butuhkan di sini adalah beberapa matematika.

Mengapa Matematika Ketika Unity Akan Melakukannya Untuk Anda?

Bagi Anda di luar sana yang takut menatap selembar kertas yang ditutupi dengan angka-angka yang tidak masuk akal (walaupun ada beberapa .) situs web yang bagus yang dapat membantu Anda belajar Matematika), jangan takut. Kami membutuhkan cara untuk membuat nilai potensiometer kami sesuai dengan posisi X bola kami. Untungnya, kita bisa menggunakan Metode Ekstensi .

Metode Ekstensi adalah skrip yang melakukan pekerjaan tertentu untuk kita. Dalam hal ini, kami memberikan nilai yang kami miliki, dan mengembalikannya dipetakan satu sama lain, siap digunakan dalam bolaPenggerak naskah. Di bagian atas panel Proyek, klik Buat > Skrip C# dan beri nama ExtensionMethods. Masukkan kode di bawah ini ke dalam skrip:

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

Simpan skrip, dan kembali ke skrip sphereMover Anda. Kami sekarang dapat menggunakan fungsi Remap ini dalam skrip ExtensionMethods kami di fungsi Pembaruan kami untuk mengubah nilai potensiometer kami menjadi nilai yang dapat digunakan dalam permainan kami. Di bawah tempat kami baru saja menetapkan variabel potValue, ketikkan yang berikut ini:

Prompt menunjukkan kepada kita bahwa Remap kita mengambil dua set nilai From dan To, dan memetakannya bersama-sama. Kita bisa memasukkan nilai-nilai kita ke dalamnya.

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

Simpan skrip Anda, kembali ke editor Unity, dan tekan tombol putar. Anda sekarang akan melihat bahwa variabel Pot yang Dipetakan berubah saat Anda menggerakkan potensiometer, agar sesuai dengan nilai yang kami tentukan untuk Tepi Kiri dan Kanan kami. Luangkan waktu sejenak untuk duduk dan berterima kasih kepada skrip ExtensionMethods Anda. Tidak ada kalkulator yang terlihat.

Catatan: jika Anda memperhatikan bahwa nilai Anda terbalik, jadi ketika potensiometer Anda mengarah ke kanan, Anda mendapatkan nilai negatif untuk variabel Pot yang Dipetakan, Anda mungkin mengatur potensiometer Anda dengan cara yang salah. Untungnya, Anda dapat memperbaikinya tanpa melakukan pengkabelan ulang. Anda cukup mengganti nilainya saat Anda memetakannya kembali:

Sekarang kami akhirnya memiliki nilai yang dapat digunakan. Sekarang yang tersisa untuk dilakukan adalah menetapkan nilai-nilai itu ke posisi X bola kita:

cara menambah memori video khusus windows 10
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Simpan skrip Anda, kembali ke editor Unity dan tekan putar. Anda sekarang harus dapat memindahkan Sphere Anda ke kiri dan kanan menggunakan potensiometer Anda!

Menempatkan Tombol untuk Bekerja

Sekarang setelah bola kita bergerak, bukankah menyenangkan memiliki cara untuk sedikit memperlambat saat kita berada di tempat yang sempit? Kami akan menggunakan tombol kami untuk memperlambat waktu dalam permainan kami. Buka skrip sphereMover Anda, dan tambahkan kode ini ke fungsi Pembaruan Anda

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

Sekarang kami memiliki mekanisme permainan kami, mari tambahkan beberapa rintangan! Kita akan menggunakan musuh alami bola, kubus. Dalam hierarki, klik Buat > Objek 3d > Kubus . Di inspektur kubus, Tambahkan Komponen > Fisika > Rigidbody . Atur nilai Drag dari rigidbody ke 5. Juga, di bawah komponen Box Collider di inspektur, pilih Is Trigger. Ini akan memungkinkan kita untuk mendeteksi tabrakan dengan Sphere kita.

Buat skrip di kubus dan beri nama bertabrakanDenganSphere , buka skrip dan hapus fungsi Mulai dan Perbarui karena kali ini kita tidak akan membutuhkannya. Masukkan kode ini:

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

OnTriggerEnter mengirim pesan setiap kali trigger clasher mengenai clasher lain. Dalam hal ini, kami menyuruhnya untuk menghancurkan apa pun yang disentuhnya. Simpan skrip dan kembali ke editor Unity. Seret kubus dari hierarki ke panel Proyek. Anda akan melihat teks kubus dalam hierarki telah berubah menjadi biru. Ini karena kami telah membuat cetakan dan menyimpannya di proyek kami. Hapus kubus Anda dari hierarki sekarang.

Yang kita butuhkan sekarang adalah skrip untuk menelurkan kubus. Dalam hierarki klik Buat > Buat Kosong , dan ganti namanya menjadi Game Manager di Inspector dan tambahkan skrip yang disebut gameManager. Buka skrip dan tambahkan kode ini:

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

}
}

Simpan skrip. Kembali ke editor, pilih Game Manager dalam hierarki, dan seret cetakan kubus Anda dari panel proyek ke variabel Cube di Inspector. Isi nilai untuk pemijahan Anda di sini juga. Anda dapat mengutak-atiknya untuk membuatnya sesulit atau semudah yang Anda suka. Perhatikan bahwa ada baiknya membuat kubus terendah Anda muncul cukup tinggi untuk memungkinkan Uniduino untuk menginisialisasi -- kalah dalam permainan sebelum Anda dapat bergerak mungkin membuat frustrasi!

Proyek Selesai

Sekarang ketika Anda menekan play, kubus akan muncul di atas Anda dan jatuh. Anda dapat menggunakan potensiometer Anda untuk menghindarinya, dan tombol Anda untuk memperlambat waktu.

Dalam proyek ini kami telah membuat pengontrol khusus dengan Arduino, mengonfigurasi Unity dan Uniduino untuk berkomunikasi dengannya, dan membuat game sederhana untuk mengujinya. Konsep di sini dapat diterapkan ke hampir semua proyek, dan bahkan ada kemacetan permainan yang berspesialisasi dalam pengontrol khusus .

Dengan Arduino dan Unity Anda dapat membuat pengontrol khusus dari hampir semua hal. Sudahkah Anda membuat hi-fi yang mengontrol pesawat luar angkasa? Pemanggang roti yang mengontrol permainan platform?

Jika Anda telah membuat proyek seperti ini, saya ingin melihatnya! Posting di komentar di bawah!

Membagikan Membagikan Menciak Surel 6 Alternatif Audible: Aplikasi Audiobook Gratis atau Murah Terbaik

Jika Anda tidak suka membayar untuk buku audio, berikut adalah beberapa aplikasi hebat yang memungkinkan Anda mendengarkannya secara gratis dan legal.

Baca Selanjutnya
Topik-topik yang berkaitan
  • buatan sendiri
  • Pemrograman
  • Arduino
  • Pengontrol permainan
  • Pengembangan Game
Tentang Penulis Ian Buckley(216 Artikel Diterbitkan)

Ian Buckley adalah jurnalis lepas, musisi, pemain, dan produser video yang tinggal di Berlin, Jerman. Ketika dia tidak menulis atau di atas panggung, dia bermain-main dengan elektronik atau kode DIY dengan harapan menjadi ilmuwan gila.

More From Ian Buckley

Berlangganan newsletter kami

Bergabunglah dengan buletin kami untuk kiat teknologi, ulasan, ebook gratis, dan penawaran eksklusif!

Klik di sini untuk berlangganan