Cách tạo bộ điều khiển trò chơi tùy chỉnh với Arduino và Unity

Cách tạo bộ điều khiển trò chơi tùy chỉnh với Arduino và Unity

Bạn đã bao giờ muốn thiết kế bộ điều khiển trò chơi của riêng mình? Nó dễ dàng hơn bạn nghĩ!





Trong dự án ngắn này, chúng tôi sẽ xây dựng một bộ điều khiển trò chơi tùy chỉnh đơn giản để sử dụng với công cụ trò chơi Unity. Bộ điều khiển này sẽ được cung cấp bởi Arduino Uno, mặc dù bạn cũng có thể sử dụng một trong nhiều lựa chọn thay thế cho dự án này. Chúng tôi cũng sẽ tạo một trò chơi cơ bản, nơi bạn sẽ sử dụng bộ điều khiển của mình để tránh các vật thể rơi và làm chậm thời gian.





Đối với dự án này, bạn sẽ cần

  • Arduino hoặc vi điều khiển tương tự
  • 1 x điện trở 10k Ohm
  • 1 x Công tắc tạm thời
  • 1 x chiết áp
  • Dây móc
  • Một breadboard
  • Công cụ trò chơi Unity
  • Plugin Uniduino từ Unity Asset Store ($ 30)
  • Hoàn thành mã dự án, trong trường hợp bạn không muốn viết ra (không bao gồm plugin Uniduino)

Hầu hết những thứ này đều có sẵn trong bộ khởi động Arduino. Nếu chưa có bộ khởi động, hãy xem hướng dẫn của chúng tôi để chọn bộ tốt nhất cho bạn.





Bạn có thể làm cho bộ điều khiển của mình phức tạp như bạn muốn, mặc dù trong ví dụ này, chúng tôi sẽ thiết lập một chiết áp và một nút - hoàn hảo để điều khiển một trò chơi arcade đơn giản.

Lắp ráp bộ điều khiển của bạn

Thiết lập breadboard và Arduino của bạn như trong hình bên dưới. Đây là những gì chúng tôi sẽ sử dụng làm bộ điều khiển trò chơi của mình, mặc dù bạn có thể sử dụng thiết lập gần như chính xác như Bộ điều khiển midi tự làm quá!



Chuẩn bị Arduino của bạn

Khi bạn đã có dây mọi thứ, hãy kết nối Arduino của bạn qua USB. Trong IDE phần mềm Arduino, hãy đến Công cụ> BảngCông cụ> Cổng để chọn bộ vi điều khiển và cổng bạn đang sử dụng. Arduino IDE đi kèm với bản phác thảo mà chúng tôi cần và bạn có thể tìm thấy nó dưới Tệp> Ví dụ> Firmata> StandardFirmata . Nhấp vào Tải lên và bạn sẽ sẵn sàng.

Nếu bạn chưa quen với Arduino và đầu của bạn hơi nóng, hãy xem Hướng dẫn cho người mới bắt đầu để giúp bạn làm cho nó nói chuyện với máy tính của bạn một cách độc đáo.





Thiết lập dự án thống nhất của bạn

Trong Unity, hãy mở Window> Asset Store để truy cập Kho nội dung của Unity từ trong Unity Editor. Tìm kiếm trong Cửa hàng tài sản để tìm plugin Uniduino. Plugin này sẽ cho phép bạn nhận và gửi dữ liệu đến và từ các chân Arduino của bạn bên trong Unity. Plugin tại thời điểm viết bài này có giá 30 đô la. Điều đó là có thể để thực hiện dự án này mà không cần mua plugin, mặc dù nó khá phức tạp hơn và bạn có thể thấy plugin thuận tiện hơn.

Video này từ những người tạo plugin sẽ đưa bạn qua quá trình kiểm tra mọi thứ đang hoạt động, cùng với thiết lập lần đầu tiên. Lưu ý rằng bạn cũng có thể phải đặt lại trình chỉnh sửa Unity trên Windows.





Chúng tôi có thể sử dụng cùng một bảng kiểm tra này để kiểm tra bộ điều khiển của chúng tôi. Đặt Pin D2 thành INPUT và Digital. Tiếp tục xuống, đặt Pin A5 thành ANALOG. Chiết áp và nút của bạn sẽ hiển thị các giá trị trên màn hình bên cạnh số pin của chúng ngay bây giờ. Tiến triển!

Bây giờ để tạo ra thứ gì đó mà chúng ta có thể kiểm soát

Vì vậy, chúng ta có một bộ điều khiển, nhưng chúng ta sẽ kiểm soát cái gì? Chà, khả năng là vô tận, nhưng hôm nay chúng ta sẽ tạo ra một trò chơi né tránh rất đơn giản để thử nghiệm hệ thống điều khiển mới của chúng ta. Chúng tôi sẽ chuyển qua phần thiết lập trò chơi khá nhanh, vì vậy nếu bạn hoàn toàn mới sử dụng công cụ Unity, bạn có thể tìm thấy Hướng dẫn cho người mới bắt đầu lập trình trò chơi Unity hữu ích để có được vòng bi của bạn.

Chúng tôi sẽ xây dựng một trò chơi rất cơ bản, trong đó mục đích của bạn là né quả cầu của bạn sang trái và phải để tránh các khối vuông rơi xuống, điều này sẽ sử dụng bộ điều khiển tùy chỉnh mới được tạo của bạn.

Tạo một cảnh mới và kéo nhà lắp ghép Uniduino từ Nội dung> Uniduino> Prefabs vào hệ thống phân cấp của bạn và kéo nhà lắp ghép Uniduino vào hệ thống phân cấp. Chúng tôi cần nó ở đó để nói chuyện giữa trò chơi và bộ điều khiển của chúng tôi.

Trong phân cấp thống nhất, nhấp vào Tạo> Hình cầu và sử dụng tab Transform trong Thanh tra để di chuyển nó xuống cuối màn hình trò chơi.

Đã đến lúc nhận mã hóa

Bây giờ để thêm một số mã cho bữa tiệc này. Với hình cầu được chọn trong Hệ thống phân cấp, hãy nhấp vào Thêm thành phần> Tập lệnh mới ở cuối cửa sổ Thanh tra. Gọi tên nó quả cầu và chọn C Sharp từ trình đơn thả xuống. Nhấp chuột Tạo và Thêm và tập lệnh sẽ được thêm vào GameObject. Nhấp đúp vào nó để mở tập lệnh và nhập mã này:

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

Hãy dành một chút thời gian để đọc qua các bình luận mã. Cho đến nay, chúng tôi đã khai báo một số biến cho Arduino, các chân của nó và Sphere của chúng tôi. Chúng tôi cũng đã sử dụng

Phương thức Start và ConfigurePins để khởi tạo Arduino của chúng tôi trong thời gian chạy. Hãy lưu tập lệnh của chúng tôi và quay lại trình chỉnh sửa Unity và xem những gì đã thay đổi.

Bây giờ chúng ta có thể thấy các biến công khai của mình trong cửa sổ Thanh tra. Hãy xem những gì chúng ta có thể nhập ở giai đoạn này để giúp chúng ta sau này. Chúng tôi biết chúng tôi đang sử dụng mã pin nào trên Arduino từ bản dựng trước đó, chúng tôi có thể nhập chúng. Chúng tôi cũng biết từ thí nghiệm của mình trước đó chúng tôi muốn quả cầu của mình có thể di chuyển qua trái và phải bao xa để nó không rơi khỏi màn hình. Hãy nhập các giá trị này ngay bây giờ.

Dấu hiệu đầu tiên của sự sống

Đã đến lúc thực sự thấy các giá trị từ Arduino của chúng tôi bên trong Unity Editor. Hiện tại, chúng ta có thể thêm một dòng mã vào chức năng Cập nhật của tập lệnh SphereMover và lưu lại tập lệnh.

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

Bây giờ chúng ta đã cập nhật biến potValue của mình trên mọi khung hình, chúng ta có thể thấy giá trị của nó trong thời gian thực trong Trình kiểm tra thống nhất. Trước khi chúng tôi kiểm tra, bây giờ sẽ là thời điểm tốt để kiểm tra xem phích cắm Uniduino có đang lắng nghe đúng cổng hay không. Nhấp vào Uniduino trong Heirarchy và kiểm tra Tên cổng trong Thanh tra. Nếu nó trống, hãy điền số cổng chính xác cho Arduino của bạn. Trong trường hợp này, đó là COM4, ​​mặc dù nó có thể khác đối với bạn. Kiểm tra bằng cách sử dụng Arduino IDE nếu bạn không chắc chắn.

Chọn hình cầu của bạn trong hệ thống phân cấp và nhấp vào nút Phát ở đầu màn hình. Hệ thống cần một vài giây để khởi động, sau đó bạn sẽ bắt đầu thấy biến Pot Value thay đổi trong trình kiểm tra khi bạn di chuyển chiết áp.

Bây giờ chúng tôi đang nói! Chà, nói một cách chính xác thì Unity và Arduino đang nói chuyện, nhưng ai đang đếm? Nếu bạn đã đến mức này và không thấy giá trị thay đổi trong trình kiểm tra, hãy kiểm tra lại các bước thiết lập và đảm bảo rằng bạn đã chọn đúng Cổng cho Arduino của mình.

Hãy di chuyển hình cầu này

Bây giờ chúng tôi đã cập nhật biến potValue, chúng tôi muốn sử dụng giá trị này để di chuyển hình cầu của chúng tôi. Khi chiết áp lệch hết về bên trái, chúng ta muốn hình cầu ở bên trái màn hình và ngược lại. Các đối tượng trong Unity được định vị tại một điểm trong không gian Vectơ, được xác định bởi các giá trị của nó Transform.position . Trong hình ảnh dưới đây, nơi hình cầu nằm ở điểm xa nhất bên trái mà chúng tôi muốn có, bạn có thể thấy rằng vectơ vị trí của nó là 9,5, -4, 0.

Chúng ta muốn ảnh hưởng đến vị trí X của quả cầu. Rất tiếc, việc sử dụng trực tiếp các giá trị từ chiết áp của chúng tôi sẽ không hoạt động, vì khi chiết áp nằm hết về bên trái, nó cho giá trị 0 - điều này sẽ đặt hình cầu của chúng ta ngay giữa màn hình. Ở cực khác, giá trị hàng đầu của chiết áp, 1023, sẽ đặt khối lập phương lệch sang bên phải màn hình của chúng ta. Không hữu ích. Những gì chúng ta cần ở đây là một số toán học.

Tại Sao Toán Học Khi Sự Thống Nhất Sẽ Làm Việc Đó Cho Bạn?

Đối với những người trong số các bạn ngoài kia, sợ hãi khi nhìn chằm chằm vào một mảnh giấy được bao phủ bởi những con số vô nghĩa (mặc dù có một số trang web tuyệt vời điều đó có thể giúp bạn học Toán), đừng sợ. Chúng ta cần một cách để làm cho các giá trị chiết áp của chúng ta tương ứng với vị trí X của quả cầu của chúng ta. May mắn thay, chúng ta có thể sử dụng một Phương pháp mở rộng .

Phương thức mở rộng là một tập lệnh thực hiện một công việc cụ thể cho chúng tôi. Trong trường hợp này, chúng tôi cung cấp cho nó các giá trị chúng tôi có và nó trả về chúng được ánh xạ với nhau, sẵn sàng được sử dụng trong quả cầu kịch bản. Ở đầu bảng điều khiển Dự án, hãy nhấp vào Tạo> Tập lệnh C # và đặt tên là ExtensionMethods. Nhập mã bên dưới vào tập lệnh:

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

Lưu tập lệnh và quay lại tập lệnh SphereMover của bạn. Bây giờ chúng tôi có thể sử dụng chức năng Bản đồ lại này trong tập lệnh ExtensionMethods của chúng tôi trong chức năng Cập nhật của chúng tôi để chuyển đổi các giá trị chiết áp thành các giá trị có thể sử dụng được trong trò chơi của chúng tôi. Dưới nơi chúng tôi vừa gán biến potValue, hãy nhập như sau:

Lời nhắc cho chúng tôi thấy rằng Bản đồ lại của chúng tôi nhận hai bộ giá trị Từ và Đến và ánh xạ chúng với nhau. Chúng tôi có thể nhập các giá trị của chúng tôi vào điều này.

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

Lưu tập lệnh của bạn, quay lại trình chỉnh sửa Unity và nhấn nút phát. Bây giờ bạn sẽ thấy rằng biến Mapped Pot thay đổi khi bạn di chuyển chiết áp, để tương ứng với các giá trị mà chúng tôi đã xác định cho Cạnh trái và Cạnh phải của chúng tôi. Hãy dành một chút thời gian để ngồi lại và cảm ơn tập lệnh ExtensionMethods của bạn. Không phải là một máy tính trong tầm nhìn.

Lưu ý: nếu bạn nhận thấy rằng các giá trị của bạn bị đảo ngược, vì vậy khi chiết áp của bạn ở hết phía bên phải, bạn đang nhận được giá trị âm cho biến Mapped Pot của mình, bạn có thể đã thiết lập chiết áp sai cách. May mắn thay, bạn có thể sửa lỗi này mà không cần thực hiện bất kỳ tua lại nào. Bạn có thể chỉ cần chuyển đổi các giá trị khi bạn remap chúng:

Bây giờ chúng ta cuối cùng đã có các giá trị có thể sử dụng được. Bây giờ tất cả những gì còn lại cần làm là gán các giá trị đó cho vị trí X của quả cầu của chúng ta:

gửi email giả từ người khác
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Lưu tập lệnh của bạn, quay lại trình chỉnh sửa Unity và nhấn phát. Bây giờ bạn có thể di chuyển Sphere của mình sang trái và phải bằng chiết áp của bạn!

Đặt nút để làm việc

Bây giờ chúng ta có quả cầu của mình đang chuyển động, sẽ không hay nếu có cách để làm chậm mọi thứ một chút khi chúng ta gặp khó khăn? Chúng tôi sẽ sử dụng nút của mình để làm chậm thời gian trong trò chơi của chúng tôi. Mở tập lệnh SphereMover của bạn và thêm mã này vào chức năng Cập nhật của bạn

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

Bây giờ chúng ta có cơ chế của trò chơi của chúng ta, hãy thêm một số chướng ngại vật! Chúng ta sẽ sử dụng thiên địch của khối cầu, khối lập phương. Trong hệ thống phân cấp, hãy nhấp vào Tạo> Đối tượng 3d> Khối lập phương . Trong thanh tra của khối lập phương, Thêm thành phần> Vật lý> Thân cứng . Đặt giá trị Kéo của phần cứng thành 5. Ngoài ra, trong thành phần Box Collider trong trình kiểm tra, hãy chọn Is Trigger. Điều này sẽ cho phép chúng tôi phát hiện các va chạm với Sphere của chúng tôi.

Tạo một tập lệnh trên khối lập phương và gọi nó collideWithSphere , mở tập lệnh và xóa các chức năng Bắt đầu và Cập nhật vì chúng tôi sẽ không cần chúng lần này. Nhập mã này:

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

OnTriggerEnter gửi một tin nhắn bất cứ khi nào máy va chạm kích hoạt chạm vào một máy va chạm khác. Trong trường hợp này, chúng tôi đang yêu cầu nó phá hủy bất cứ thứ gì nó chạm vào. Lưu tập lệnh và quay lại trình chỉnh sửa Unity. Kéo khối lập phương từ hệ thống phân cấp vào bảng điều khiển Dự án. Bạn sẽ nhận thấy văn bản của khối lập phương trong hệ thống phân cấp đã chuyển sang màu xanh lam. Điều này là do chúng tôi đã tạo nhà lắp ghép và lưu nó trong dự án của mình. Xóa khối lập phương của bạn khỏi hệ thống phân cấp ngay bây giờ.

Tất cả những gì chúng ta cần bây giờ là một script để tạo ra các hình khối. Trong phân cấp nhấp chuột Tạo> Tạo trống và đổi tên nó thành Game Manager trong Thanh tra và thêm một tập lệnh vào nó có tên là gameManager. Mở tập lệnh và thêm mã này:

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

}
}

Lưu tập lệnh. Quay lại trình chỉnh sửa, chọn Trình quản lý trò chơi trong hệ thống phân cấp và kéo nhà lắp ghép khối lập phương của bạn từ bảng điều khiển dự án vào biến Khối lập phương trong Trình kiểm tra. Điền vào các giá trị cho quá trình sinh sản của bạn ở đây. Bạn có thể tùy ý biến nó thành khó hay dễ tùy thích. Lưu ý rằng đáng để các khối thấp nhất của bạn sinh ra đủ cao để cho phép Uniduino khởi chạy - việc thua trò chơi trước khi bạn có thể di chuyển có thể khiến bạn bực bội!

Dự án đã hoàn thành

Bây giờ khi bạn nhấn phát, các khối sẽ xuất hiện phía trên bạn và rơi xuống. Bạn có thể sử dụng chiết áp để tránh chúng và nút để làm chậm thời gian.

Trong dự án này, chúng tôi đã tạo một bộ điều khiển tùy chỉnh với Arduino, cấu hình Unity và Uniduino để giao tiếp với nó và tạo một trò chơi đơn giản để thử nghiệm nó. Các khái niệm ở đây có thể được áp dụng cho hầu hết mọi dự án, và thậm chí còn có trò chơi ùn tắc chuyên về bộ điều khiển tùy chỉnh .

Với Arduino và Unity, bạn có thể tạo bộ điều khiển tùy chỉnh từ hầu hết mọi thứ. Bạn đã tạo ra hi-fi điều khiển tàu vũ trụ chưa? Một máy nướng bánh mì điều khiển một trò chơi nền tảng?

Nếu bạn đã thực hiện một dự án như thế này, tôi rất muốn xem nó! Đăng nó trong các bình luận bên dưới!

Đăng lại Đăng lại tiếng riu ríu E-mail 6 lựa chọn thay thế có thể nghe được: Ứng dụng sách nói miễn phí hoặc giá rẻ tốt nhất

Nếu bạn không thích trả tiền cho sách nói, đây là một số ứng dụng tuyệt vời cho phép bạn nghe chúng miễn phí và hợp pháp.

Đọc tiếp
Chủ đề liên quan
  • DIY
  • Lập trình
  • Arduino
  • Người điều khiển trò chơi
  • Sự phát triển trò chơi
Giới thiệu về tác giả Ian Buckley(216 bài báo đã xuất bản)

Ian Buckley là một nhà báo tự do, nhạc sĩ, nghệ sĩ biểu diễn và nhà sản xuất video sống ở Berlin, Đức. Khi không viết hay trên sân khấu, anh ấy sẽ mày mò với các thiết bị điện tử hoặc mã tự làm với hy vọng trở thành một nhà khoa học điên rồ.

Xem thêm từ Ian Buckley

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký
Thể LoạI Diy