Tôi đang tìm kiếm một hướng dẫn về kết nối WiiMote với Unity 5 như một thiết bị Nhập liệu. Tôi đã tìm thấy thư viện này ở đây nhưng tôi không hiểu cách cài đặt nó và những điều kiện tiên quyết để nó hoạt động.
Tôi đang tìm kiếm một hướng dẫn về kết nối WiiMote với Unity 5 như một thiết bị Nhập liệu. Tôi đã tìm thấy thư viện này ở đây nhưng tôi không hiểu cách cài đặt nó và những điều kiện tiên quyết để nó hoạt động.
Câu trả lời:
Tôi đã cố gắng xem xét thư viện UniWii được liên kết trong câu hỏi , nhưng trang tải xuống Windows dường như là một liên kết bị hỏng tại thời điểm này và các chủ đề diễn đàn về nó chủ yếu là 4 năm tuổi. :
Ý tưởng cơ bản mà nó sử dụng, một plugin DLL gốc được tham chiếu từ C # với ánh xạ [DLLImport], là một ý tưởng hay. Tôi đã sử dụng thành công để giao tiếp với bộ điều khiển Kinect và Playstation Move, vì vậy nếu bạn tìm thấy bản tải xuống hoạt động của phiên bản cập nhật của plugin này, có lẽ đó là một tùy chọn tốt hơn và mạnh mẽ hơn mà tôi sắp làm trình bày dưới đây.
Phương pháp tôi đã sử dụng để đưa thông tin Wii Remote vào Unity (hoặc Flash) là cài đặt một chương trình bên ngoài như Găng tay trên Windows hoặc OSCulator trên Mac. Các chương trình này thực hiện Mô phỏng đầu vào có thể lập trình, giao tiếp hiệu quả với nhiều loại thiết bị và cung cấp cho bạn các công cụ để kiểm soát cách chúng nói chuyện với nhau.
Cả hai đều thể hiện khả năng gửi và nhận dữ liệu qua các tin nhắn Open Sound Control , chúng tôi sẽ lắng nghe trong Unity để đọc dữ liệu đến từ Wii Remote.
Tôi sẽ mô tả phương pháp Găng tay vì tôi quen thuộc nhất khi làm việc trên Windows.
Đảm bảo bộ điều hợp Bluetooth của máy tính của bạn được bật.
Chạy Găng tay và điền vào một tập lệnh mới với nội dung như sau:
(Bạn có thể lưu tệp này dưới dạng tệp ".PIE" mới để tải tệp này sau)
var.port = 54934
debug = "On: " + Wiimote1.Exists + " Wiimote battery level: " + Wiimote1.Battery + " Rotation: " + Wiimote1.YawSpeed
SendOsc("localhost", var.port, "/wii/1/start", true)
SendOsc("localhost", var.port, "/wii/1/acceleration", tostring(Wiimote1.gx), tostring(Wiimote1.gy), tostring(Wiimote1.gz))
SendOsc("localhost", var.port, "/wii/1/rotationSpeed", tostring(Wiimote1.PitchSpeed in radians), tostring(-Wiimote1.YawSpeed in radians), tostring(Wiimote1.RollSpeed in radians))
SendOsc("localhost", var.port, "/wii/1/analog", tostring(Wiimote1.Nunchuk.JoyX), tostring(Wiimote1.Nunchuk.JoyY))
SendOsc("localhost", var.port, "/wii/1/buttonA", int(Wiimote1.A))
SendOsc("localhost", var.port, "/wii/1/buttonB", int(Wiimote1.B))
SendOsc("localhost", var.port, "/wii/1/buttonC", int(Wiimote1.Nunchuk.C))
SendOsc("localhost", var.port, "/wii/1/buttonZ", int(Wiimote1.Nunchuk.Z))
SendOsc("localhost", var.port, "/wii/1/button1", int(Wiimote1.One))
SendOsc("localhost", var.port, "/wii/1/done", true)
Nhấp vào nút "Chạy" trong Găng tay. Bây giờ nó đang quét từ xa Wii.
Đặt Remote Wii trên một mặt phẳng (để hiệu chuẩn ban đầu ổn định)
Nhấn các nút 1 & 2 trên Wii Remote cùng một lúc.
Tất cả 4 đèn trên điều khiển từ xa sẽ nhấp nháy - Wii Remote đang quét các máy thu
Bạn có thể bỏ qua điều này, bao gồm bất kỳ hộp thoại nào nói rằng bạn cần khởi động lại (chúng nói dối).
Găng tay đã tìm thấy điều khiển từ xa
Găng tay đang hiệu chỉnh các cảm biến. Giữ điều khiển từ xa, hoặc nó sẽ hiệu chỉnh mãi mãi (điều mà đôi khi nó vẫn làm).
Điều khiển từ xa được đăng ký là trình phát 1 và đang gửi dữ liệu qua các tin nhắn Open Sound Control.
Hộp Gỡ lỗi trong Găng tay sẽ cho thấy rằng điều khiển từ xa tồn tại, báo cáo mức pin của nó và hiển thị dữ liệu xoay vòng ngáp hiện tại. (Đó là dòng thứ hai của kịch bản ở trên). Nếu bạn không nhận được dữ liệu ngáp khi xoay bộ điều khiển, thì bạn nên tắt nguồn và thử ghép lại.
Lưu ý rằng khi bạn dừng tập lệnh, đèn sẽ tắt, nhưng điều khiển từ xa vẫn BẬT và làm cạn kiệt pin. Nếu bạn không sử dụng điều khiển trong một thời gian, hãy giữ nút nguồn để tắt. Bạn sẽ phải bắt đầu lại từ bước 3 khi bạn muốn sử dụng lại.
Được rồi, vậy đó là cách lấy dữ liệu vào máy tính của bạn. Bây giờ bạn có thể sử dụng một thư viện như OSCuMote ( liên kết tải xuống ) để đọc các tin nhắn OSC đến trên cổng 54934 và truy cập dữ liệu trong các tập lệnh Unity C # của bạn.
Tôi sẽ cố gắng dọn sạch tập lệnh C # mà tôi đã viết cho dự án cuối cùng của mình và đưa nó vào như một phần của câu trả lời này.
Mặc dù câu trả lời của DMGregory là thực sự kỹ lưỡng và tốt nhưng tôi đã tìm thấy một giải pháp khác và mạnh mẽ hơn phù hợp với nhu cầu của tôi. Tôi đã tìm thấy một dll (hiện tại tôi không thể tìm thấy liên kết nhưng sẽ tải lên ở đâu đó và chỉnh sửa câu trả lời của tôi để bao gồm liên kết) và sử dụng DLLImport và các chức năng này
[DllImport ("UniWii")]
private static extern void wiimote_start();
[DllImport ("UniWii")]
private static extern void wiimote_stop();
[DllImport ("UniWii")]
private static extern int wiimote_count();
[DllImport ("UniWii")]
private static extern byte wiimote_getAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccZ(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrX(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrY(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getRoll(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getPitch(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getYaw(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonA(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonB(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonUp(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonLeft(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonRight(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonDown(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton1(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton2(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonPlus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonMinus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonHome(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccZ(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckC(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckZ(int which);
Tôi đã quản lý để giao diện với WiiMote và có được chức năng tôi cần.
Nhà xuất bản ban đầu của dll không còn hỗ trợ nó nữa, hoặc không quan tâm nữa. Tôi đã gửi email cho họ về điều đó và họ vẫn chưa trả lời sau một vài tháng. Tôi tìm thấy nó mặc dù trong một dự án được lưu trữ trong mã google ( ở đây ). Đây là một dự án đầy đủ với các ví dụ và.
EDIT Cũng lưu ý nếu bạn sử dụng dll này cho một ứng dụng thương mại, bạn sẽ phải liên hệ với nhà xuất bản gốc để được cấp phép (nếu bạn quản lý để nhận được phản hồi từ họ). Và tôi cũng gặp một số vấn đề khi sử dụng dll này khi xây dựng trên máy 64 bit bằng Unity 64 bit (nếu nó được xây dựng trên máy 32 bit thì mọi thứ đều ổn và nó chạy hoàn hảo trên cả 64 bit và 32 bit)