Cara Membuat Pengawal Permainan Custom Dengan Arduino dan Unity

Cara Membuat Pengawal Permainan Custom Dengan Arduino dan Unity

Adakah anda pernah mahu merancang pengawal permainan anda sendiri? Lebih mudah daripada yang anda fikirkan!





Dalam projek pendek ini, kami akan membina pengawal permainan khusus yang mudah digunakan dengan mesin permainan Unity. Pengawal ini akan dikuasakan oleh Arduino Uno, walaupun anda boleh menggunakan salah satu daripada banyak alternatif di luar sana untuk projek ini juga. Kami juga akan membuat permainan asas di mana anda akan menggunakan alat kawalan anda untuk mengelakkan objek jatuh dan melambatkan masa.





Untuk Projek Ini Anda Perlu

  • Arduino atau mikrokontroler serupa
  • Perintang 1 x 10k Ohm
  • 1 x Suis sesaat
  • 1 x Potensiometer
  • Kabel penyambung
  • Papan roti
  • Enjin permainan perpaduan
  • Plugin Uniduino dari Unity Asset Store ($ 30)
  • Lengkapkan kod projek, sekiranya anda tidak mahu menuliskannya (tidak termasuk pemalam Uniduino)

Sebilangan besar perkara ini terdapat dalam kit permulaan Arduino. Sekiranya tidak mempunyai kit pemula, periksa panduan kami untuk memilih yang terbaik untuk anda.





Anda boleh menjadikan pengawal anda rumit seperti yang anda mahukan, walaupun untuk contoh ini kami akan menyiapkan potensiometer dan butang - sesuai untuk mengendalikan permainan arked sederhana.

Memasang Pengawal Anda

Siapkan papan roti dan Arduino anda seperti yang ditunjukkan dalam gambar di bawah. Inilah yang akan kami gunakan sebagai pengawal permainan kami, walaupun Anda dapat menggunakan persiapan yang hampir sama seperti Pengawal midi DIY juga!



Menyiapkan Arduino Anda

Setelah semuanya disambungkan, sambungkan Arduino anda melalui USB. Dalam Perisian Arduino IDE menuju ke Alatan> Papan dan Alatan> Pelabuhan untuk memilih mikrokontroler dan port yang anda gunakan. Arduino IDE dilengkapi dengan lakaran yang kami perlukan, dan anda boleh mendapatkannya di bawah Fail> Contoh> Firmata> StandardFirmata . Klik Muat naik dan anda akan bersedia untuk pergi.

Sekiranya anda baru mengenal Arduino dan kepala anda meleleh sedikit, periksa kami Panduan Permulaan untuk membantu anda bercakap dengan komputer anda dengan baik.





Menyiapkan Projek Perpaduan Anda

Dalam Perpaduan, buka Tetingkap> Kedai Aset untuk mengakses Kedai Aset Unity dari dalam Unity Editor. Cari Asset Store untuk pemalam Uniduino. Pemalam ini akan membolehkan anda menerima dan menghantar data ke dan dari pin Arduino anda di dalam Unity. Plugin pada masa penulisan berharga $ 30. Ia adalah mungkin untuk melakukan projek ini tanpa membeli pemalam, walaupun agak rumit dan anda mungkin mendapati pemalamnya lebih senang sepanjang masa.

Video dari pencipta plugin ini membawa anda melalui proses menguji semuanya berjalan lancar, dan juga persediaan pertama kali. Perhatikan bahawa anda mungkin juga harus menetapkan semula editor Unity pada Windows.





Kami boleh menggunakan panel ujian yang sama untuk menguji pengawal kami. Tetapkan Pin D2 ke INPUT dan Digital. Di bawah, tetapkan Pin A5 ke ANALOG. Potensiometer dan butang anda harus memaparkan nilai di skrin di sebelah nombor pin mereka sekarang. Kemajuan!

Sekarang untuk Membuat Sesuatu Yang Kita Boleh Kawal

Oleh itu, kita mempunyai pengawal, tetapi apa yang harus kita kendalikan? Baiklah, kemungkinannya tidak ada habisnya, tetapi untuk hari ini kita akan membuat permainan mengelak yang sangat mudah untuk menguji sistem kawalan baru kita. Kami akan beralih ke persediaan permainan dengan cepat, jadi jika anda benar-benar baru menggunakan mesin Unity, anda mungkin akan mendapatkannya Panduan Pemula Pengaturcaraan Permainan Unity berguna untuk mendapatkan galas anda.

Kami akan membina permainan yang sangat asas di mana tujuan anda adalah untuk mengelakkan bola anda ke kiri dan kanan untuk mengelakkan kiub jatuh, yang akan menggunakan pengawal khusus anda yang baru dibuat.

Buat pemandangan baru dan seret prefab Uniduino dari Aset> Uniduino> Prefab ke dalam hierachy anda dan seret prefab Uniduino ke hierarki. Kami memerlukannya untuk melakukan perbincangan antara permainan dan pengawal kami.

Pada hierarki Unity klik Buat> Sfera dan gunakan tab Transform di Inspector untuk memindahkannya ke bahagian bawah skrin permainan.

Sudah tiba masanya untuk Mendapatkan Pengekodan

Sekarang untuk menambahkan beberapa kod ke pesta ini. Dengan bidang yang dipilih dalam Hierarki, klik Tambah Komponen> Skrip Baru di bahagian bawah tetingkap Inspektor. Namakan sferaPindah dan pilih C Tajam dari menu lungsur turun. Klik Buat dan Tambah dan skrip akan ditambahkan ke GameObject. Klik dua kali di atasnya untuk membuka skrip dan masukkan kod 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 masa untuk membaca komen kod. Sejauh ini, kami telah menyatakan beberapa pemboleh ubah untuk Arduino kami, pinnya, dan Sphere kami. Kami juga telah menggunakan

Mula dan kaedah ConfigurePins untuk memulakan Arduino kami pada masa berjalan. Mari simpan skrip kami, dan kembali ke editor Unity dan lihat apa yang berubah.

Kita sekarang dapat melihat pemboleh ubah awam kita di tetingkap Inspektor. Mari lihat apa yang boleh kita masukkan pada peringkat ini untuk menolong kita kelak. Kita tahu pin apa yang kita gunakan di Arduino dari binaan kita lebih awal, kita boleh memasukkannya. Kami juga mengetahui dari eksperimen kami lebih awal sejauh mana kami mahu bidang kami dapat bergerak ke kiri dan kanan sehingga tidak jatuh dari layar. Mari masukkan nilai-nilai ini sekarang.

Tanda-Tanda Kehidupan Pertama

Sudah tiba masanya untuk melihat nilai dari Arduino kami di dalam Unity Editor. Buat masa ini, kami dapat menambahkan satu baris kod ke fungsi Kemas kini skrip sphereMover kami, dan menyimpan skrip sekali lagi.

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

Setelah pemboleh ubah potValue kami diperbaharui setiap bingkai, kami dapat melihat nilainya dalam masa nyata di Unity Inspector. Sebelum kita memberikannya ujian, sekarang adalah masa yang tepat untuk memeriksa apakah plug in Uniduino sedang mendengar di port yang betul. Klik Uniduino dalam Warisan, dan periksa Nama Port di Inspektor. Sekiranya kosong, isikan nombor port yang betul untuk Arduino anda. Dalam kes ini, ia adalah COM4, ​​walaupun mungkin berbeza bagi anda. Periksa menggunakan Arduino IDE jika anda tidak pasti.

Pilih bidang anda dalam hierarki dan klik butang Main di bahagian atas skrin. Sistem memerlukan beberapa saat untuk menginisialisasi, setelah itu anda harus mulai melihat perubahan nilai Pot Pot pada pemeriksa ketika anda menggerakkan potensiometer.

Sekarang kita bercakap! Baiklah, Unity dan Arduino bercakap dengan tegas, tetapi siapa yang mengira? Sekiranya anda telah sampai sejauh ini dan tidak melihat perubahan nilai pada pemeriksa, periksa langkah-langkah penyediaan, dan pastikan anda mempunyai Pelabuhan yang betul yang dipilih untuk Arduino anda.

Mari Pindahkan Bidang Ini

Setelah pemboleh ubah potValue diperbaharui, kami ingin menggunakan nilai ini untuk memindahkan bidang kami. Apabila potensiometer berada di sebelah kiri, kita mahu bola berada di sebelah kiri skrin, dan sebaliknya. Objek dalam Unity diposisikan pada titik di ruang Vektor, ditentukan oleh nilai-nilai itu Transform.posisi . Pada gambar di bawah, di mana sfera berada di titik paling jauh ke kiri kita menginginkannya, anda dapat melihat bahawa vektor kedudukannya adalah 9.5, -4, 0.

Kami mahu mempengaruhi kedudukan X sfera. Sayangnya menggunakan nilai dari potensiometer kita secara langsung tidak akan berfungsi, kerana ketika potensiometer sampai ke kiri ia memberikan nilai 0 - yang akan meletakkan bola kita tepat di tengah-tengah skrin. Pada tahap lain, nilai tertinggi potensiometer, 1023, akan meletakkan kubus di sebelah kanan skrin kita. Tidak berguna. Apa yang kita perlukan di sini adalah beberapa matematik.

Mengapa Matematik Apabila Perpaduan Akan Melakukannya Untuk Anda?

Bagi anda di luar sana yang takut melihat sehelai kertas yang diliputi dalam angka tidak masuk akal (walaupun ada beberapa laman web yang hebat yang boleh membantu anda belajar Matematik), jangan takut. Kita memerlukan kaedah untuk membuat nilai potensiometer kita agar sesuai dengan kedudukan X sfera kita. Nasib baik, kita boleh menggunakan Kaedah Peluasan .

Kaedah Penyambungan adalah skrip yang melakukan pekerjaan khusus untuk kita. Dalam kes ini, kami memberikan nilai yang kami miliki, dan mengembalikannya dipetakan satu sama lain, siap digunakan dalam sferaPindah skrip. Di bahagian atas panel Projek, klik Buat> Skrip C # dan namakannya ExtensionMethods. Masukkan kod di bawah 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. Kita sekarang dapat menggunakan fungsi Remap ini dalam skrip ExtensionMethods dalam fungsi Update kita untuk mengubah nilai potensiometer kita menjadi nilai yang dapat digunakan dalam permainan kita. Di bawah tempat kami baru sahaja menetapkan pemboleh ubah potValue, taipkan yang berikut:

Permintaan menunjukkan kepada kita bahawa Pemetaan semula kita mengambil dua set nilai Dari dan Ke, dan memetakannya bersama. Kita boleh memasukkan nilai kita ke dalam ini.

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

Simpan skrip anda, kembali ke editor Unity, dan tekan butang main. Anda sekarang harus melihat bahawa pemboleh ubah Mapped Pot berubah semasa anda menggerakkan potensiometer, agar sesuai dengan nilai yang kami tetapkan untuk Tepi Kiri dan Kanan kami. Luangkan masa untuk duduk dan mengucapkan terima kasih kepada skrip ExtensionMethods anda. Bukan kalkulator yang kelihatan.

Catatan: jika anda melihat bahawa nilai anda dibalikkan, jadi apabila potensiometer anda berada di sebelah kanan anda mendapat nilai negatif untuk pemboleh ubah Pot Pemetaan anda, anda mungkin membuat potensiometer anda mengatur cara yang salah. Nasib baik, anda boleh membetulkannya tanpa melakukan pendawaian semula. Anda hanya boleh menukar nilai ketika memetakannya semula:

Sekarang kita akhirnya mempunyai nilai yang boleh digunakan. Sekarang yang tinggal hanyalah menetapkan nilai-nilai tersebut ke kedudukan X sfera kita:

permainan bingo percuma untuk telefon android
//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 main. Anda sekarang seharusnya dapat memindahkan Sphere anda ke kiri dan kanan menggunakan potensiometer anda!

Meletakkan Butang Berfungsi

Sekarang kita mempunyai bidang yang bergerak, bukankah lebih baik jika kita mempunyai cara untuk memperlahankan keadaan ketika kita berada di tempat yang ketat? Kami akan menggunakan butang kami untuk melambatkan masa dalam permainan kami. Buka skrip sphereMover anda, dan tambahkan kod ini ke fungsi Kemas kini 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 kita mempunyai mekanik permainan kita, mari tambahkan beberapa halangan! Kami akan menggunakan musuh semula jadi bola, kubus. Dalam hierarki, klik Buat> Objek 3d> Cube . Di pemeriksa kiub, Tambah Komponen> Fizik> Rigidbody . Tetapkan nilai Seret badan tegar ke 5. Juga, di bawah komponen Box Collider dalam pemeriksa, pilih Is Trigger. Ini akan membolehkan kita mengesan pertembungan dengan Sphere kita.

Buat skrip di kubus dan panggilnya bertembungWithSphere , buka skrip dan hapus fungsi Mula dan Kemas kini kerana kita tidak memerlukannya kali ini. Masukkan kod ini:

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

OnTriggerEnter menghantar mesej setiap kali collider trigger memukul collider lain. Dalam contoh ini, kami memintanya untuk menghancurkan apa sahaja yang disentuhnya. Simpan skrip dan kembali ke editor Unity. Seret kiub dari hierarki ke panel Projek. Anda akan melihat teks kubus dalam hierarki telah bertukar menjadi biru. Ini kerana kami telah membuat prefab dan menyimpannya dalam projek kami. Padamkan kiub anda dari hierarki sekarang.

Yang kita perlukan sekarang adalah skrip untuk menelurkan kiub. Dalam hierarki klik Buat> Buat Kosong , dan ganti namanya menjadi Game Manager di Inspector dan tambahkan skrip yang disebut gameManager. Buka skrip dan tambahkan kod 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 Pengurus Permainan dalam hierarki, dan seret prefab kubus anda dari panel projek ke pemboleh ubah Cube di Inspektor. Isi nilai untuk pemijahan anda di sini juga. Anda boleh bermain-main dengannya sehingga sukar atau senang seperti yang anda mahukan. Perlu diingat bahawa kubus terendah anda cukup tinggi untuk membolehkan Uniduino memulakannya - kehilangan permainan sebelum anda dapat bergerak mungkin mengecewakan!

Projek Selesai

Sekarang apabila anda menekan main, kiub akan tumbuh di atas anda dan jatuh. Anda boleh menggunakan potensiometer anda untuk mengelakkannya, dan butang anda untuk memperlahankan masa.

Dalam projek ini, kami telah membuat pengawal khusus dengan Arduino, mengkonfigurasi Unity dan Uniduino untuk berkomunikasi dengannya, dan membuat permainan sederhana untuk mengujinya. Konsep di sini dapat diterapkan pada hampir semua projek, dan bahkan ada kesesakan permainan yang mengkhususkan diri dalam pengawal tersuai .

Dengan Arduino dan Unity anda boleh membuat pengawal tersuai dari hampir semua perkara. Adakah anda membuat hi-fi yang mengawal kapal angkasa? Pembakar roti yang mengawal permainan platform?

Sekiranya anda membuat projek seperti ini, saya pasti ingin melihatnya! Kirimkannya di komen di bawah!

Berkongsi Berkongsi Tweet E-mel 6 Alternatif yang didengar: Aplikasi Buku Audio Percuma atau Murah Terbaik

Sekiranya anda tidak gemar membayar buku audio, berikut adalah beberapa aplikasi hebat yang membolehkan anda mendengarkannya secara percuma dan sah.

Baca Seterusnya
Topik-topik yang berkaitan
  • DIY
  • Pengaturcaraan
  • Arduino
  • Pengawal Permainan
  • Pembangunan Permainan
Mengenai Pengarang Ian Buckley(216 Artikel Diterbitkan)

Ian Buckley adalah wartawan bebas, pemuzik, pemain dan penerbit video yang tinggal di Berlin, Jerman. Ketika dia tidak menulis atau di atas pentas, dia bermain-main dengan elektronik DIY atau kod dengan harapan menjadi saintis gila.

Lagi Dari Ian Buckley

Langgan buletin kami

Sertailah buletin kami untuk mendapatkan petua, ulasan, ebook percuma, dan tawaran eksklusif!

Klik di sini untuk melanggan