色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣使用Arduino和Unity制作自定義游戲控制器

454398 ? 來源:網絡整理 ? 作者:網絡整理 ? 2019-11-28 11:43 ? 次閱讀

您曾經想設計自己的游戲控制器嗎?

在這個簡短的項目中,我們將構建一個簡單的自定義游戲控制器,以與Unity游戲引擎一起使用。該控制器將由Arduino Uno供電,盡管您也可以使用該項目的眾多替代產品之一。我們還將創建一個基本的游戲,在該游戲中,您將使用控制器來避免物體掉落和減慢時間。

對于此項目,您將需要

Arduino或類似的微控制器

1 x 10k歐姆電阻

1 x瞬時開關

1 x電位計

連接線

面包板

Unity游戲引擎

Unity Asset Store中的Uniduino插件(30美元)

完成項目代碼,以防萬一您不想編寫它(不包括Uniduino插件)

這些東西大多數都可以在Arduino入門套件中找到。如果沒有入門工具包,請查看我們的指南,為您選擇最合適的指南。

您可以根據需要使控制器變得復雜,盡管在此示例中,我們將設置一個電位計和一個按鈕–非常適合控制簡單的街機游戲。

組裝控制器

設置面包板和Arduino,如這是我們將用作游戲控制器的圖像,盡管您也可以使用與DIY midi控制器幾乎完全相同的設置!

準備Arduino

一旦一切都連接好,請通過USB連接Arduino。在Arduino Software IDE中,轉到工具》板和工具》端口,以選擇要使用的微控制器和端口。 Arduino IDE隨附了我們所需的草圖,您可以在文件》示例》固件》 StandardFirmata 下找到它。單擊“上載”,您就可以準備就緒。

如果您是Arduino的新手,并且腦袋有點融化,請查看我們的初學者指南,以幫助您與計算機進行良好的交談。

設置您的Unity項目

InUnity,打開 Window》 Asset Store 可以從Unity編輯器中訪問Unity的Asset Store。在資產商店中搜索Uniduino插件。這個插件將允許您在Unity內部的Arduino引腳之間收發數據。在撰寫本文時,該插件的價格為30美元。可以在不購買插件的情況下進行此項目,盡管它相當復雜,并且您可能會發現插件更方便。

視頻來自插件創建者的幫助,帶您完成了所有功能的測試過程以及首次設置。請注意,您可能還必須在Windows上重置Unity編輯器。

我們可以使用同一測試面板來測試我們的控制器。將引腳D2設置為INPUT和Digital。再往下,將引腳A5設置為ANALOG。電位計和按鈕現在應該在屏幕上的引腳號旁邊顯示值。進步!

現在可以做一些我們可以控制的事情了

所以我們有一個控制器,但是我們應該控制什么呢?好吧,可能性無窮無盡,但今天,我們將創建一個非常簡單的躲避游戲,以測試我們的新控制系統。我們將很快地完成游戲設置,因此,如果您是Unity引擎的新手,您可能會發現《 Unity游戲編程初學者指南》很有用。

我們將構建一個非常基本的游戲,其中您的目標是向左和向右避開球體以避免掉落立方體,這將利用您新創建的自定義控制器。

創建一個新場景并將Uniduino預制件從資產》 Uniduino》中拖動預制件進入您的階層,然后將Uniduino預制件拖入層次結構。

在Unity層次結構中,單擊 Create》 Sphere ,然后使用檢查器中的“變換”選項卡將其移至底部。游戲畫面。

現在該開始編碼了。

現在要向此聚會添加一些代碼。在“層次結構”中選擇球體后,點擊其Inspector窗口底部的添加組件》新腳本。將其命名為 sphereMover ,然后從下拉菜單中選擇 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,其引腳和Sphere聲明了一些變量。我們還使用了

Start和ConfigurePins方法在運行時初始化Arduino。保存腳本,然后返回Unity編輯器,看看有什么更改。

我們現在可以在Inspector窗口中看到我們的公共變量。讓我們看看我們在現階段可以輸入什么以幫助我們以后。我們早先知道我們在Arduino上使用的是什么引腳,我們可以輸入它們。我們還從實驗中更早地知道了我們希望球體能夠左右移動的距離,以使其不會從屏幕上掉落。現在讓我們輸入這些值。

最初的生命跡象

是時候在Unity Editor中實際查看來自Arduino的值了。現在,我們可以在sphereMover腳本的Update函數中添加一行代碼,然后再次保存該腳本。

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,然后在檢查器中檢查它的端口名稱。如果為空白,請為您的Arduino輸入正確的端口號。在這種情況下,它是COM4,盡管它可能與您有所不同。如果不確定,請檢查使用Arduino IDE。

在層次結構中選擇球體,然后單擊屏幕頂部的“播放”按鈕。系統需要幾秒鐘的初始化時間,此后您應該在移動電位器時開始在檢查器中看到Pot Value變量的變化。

現在我們正在交談!好吧,嚴格來說,Unity和Arduino在說話,但是誰在數呢?如果您到此為止并且在檢查器中看不到值的變化,請檢查設置步驟,并確保為Arduino選擇了正確的端口。

讓我們移動這個球體

現在我們已經更新了potValue變量,我們想使用該值來移動我們的球體。當電位計完全移到左側時,我們希望球體位于屏幕的左側,反之亦然。 Unity中的對象位于Vector空間中的某個點,該點由其Transform.position的值確定。在下面的圖像中,球體在我們想要的最左邊的位置,您可以看到它的位置向量是9.5,-4,0。

我們想影響球體的X位置。不幸的是,直接使用電位器的值將不起作用,因為當電位器一直向左移動時,其值為0,這會使我們的球體位于屏幕中間。在另一個極端,電位器的最高值1023將使立方體遠離屏幕的右側。沒用。我們需要的是一些數學。

為什么Unity會為您做數學?

對于那些在那里的人,他們害怕地盯著一張無意義數字覆蓋的紙(盡管有一些很棒的網站可以幫助您學習數學),但不要害怕。我們需要一種使電位計值與球體的X位置相對應的方法。幸運的是,我們可以使用擴展方法。

擴展方法是為我們完成特定工作的腳本。在這種情況下,我們給它提供我們擁有的值,并返回它們之間的映射關系,以便在我們的 sphereMover 腳本中使用。在“項目”面板的頂部,單擊創建》 C#腳本,并將其命名為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;

}

}

保存該腳本,然后回到您的sphereMover腳本。現在,我們可以在Update函數的ExtensionMethods腳本中使用此Remap函數,將電位計值轉換為游戲中可用的值。在我們剛剛分配了potValue變量的位置,鍵入以下內容:

提示顯示我們的Remap接受了兩組From和To值,并映射了他們在一起。我們可以在其中輸入值。

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

保存您的腳本,回到Unity編輯器,然后單擊播放按鈕。現在,您應該看到,移動電位計時,“映射的電位器”變量會發生變化,以與我們為左右邊緣確定的值相對應。花一點時間坐下來,感謝您的ExtensionMethods腳本。

注意:如果您注意到自己的值是相反的,那么當電位計完全移到右邊時如果您的“ Mapped Pot”變量獲得負值,則可能是電位計設置錯誤。幸運的是,您無需進行任何重新布線即可解決此問題。重新映射它們時,只需切換值即可:

現在,我們終于有了可用的值。現在剩下要做的就是將這些值分配給我們球體的X位置:

//Assign the mapped pot value to the sphere’s x position

transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

保存腳本,返回Unity編輯器并按播放。現在,您應該可以使用電位計將Sphere左右移動!

將按鈕置于工作狀態

現在我們可以移動球形了,不是嗎?當我們在狹窄的地方時,有什么辦法可以減慢速度嗎?我們將使用按鈕來減慢游戲時間。打開您的sphereMover腳本,然后將此代碼添加到您的Update函數中

//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對象》多維數據集。在多維數據集的檢查器中,添加組件》物理》剛體。將剛體的“拖動”值設置為5。此外,在檢查器的“ Box Collider”組件下,選擇“ Is Trigger”。

在多維數據集上創建一個腳本,并將其命名為 collideWithSphere ,打開腳本并刪除Start和Update函數,這將使我們能夠檢測到與Sphere的碰撞。這次不需要他們。輸入以下代碼:

using UnityEngine;

using System.Collections;

public class collideWithSphere : MonoBehaviour

{

void OnTriggerEnter(Collider other)

{

Destroy(other.gameObject);

}

}

OnTriggerEnter每當觸發對撞機碰到另一個對撞機時都會發送一條消息。在這種情況下,我們要告訴它銷毀一切。保存腳本并返回到Unity編輯器。將多維數據集從層次結構拖動到“項目”面板。您會注意到層次結構中的多維數據集文本已變為藍色。這是因為我們已經創建了一個預制件并將其保存在我們的項目中。現在從層次結構中刪除多維數據集。

我們現在需要的是一個腳本,用于生成多維數據集。在層次結構中,單擊創建》創建空白,然后將其重命名為“檢查器”中的“游戲管理器”,然后向其中添加一個名為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 《 numberToSpwan; i++)

{

Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);

}

}

// Update is called once per frame

void Update ()

{

}

}

保存腳本。返回編輯器,在層次結構中選擇“游戲管理器”,然后將多維數據集預制體從項目面板拖到檢查器中的“多維數據集”變量。還要在此處填寫生成的值。您可以隨意擺弄它,以使其變硬或簡單。請注意,將最低的多維數據集生成足夠高以允許Uniduino初始化是值得的-在移動之前輸掉游戲可能會令人沮喪!

完成的項目

現在,當您按Play時,多維數據集將在您上方生成并掉落。您可以使用電位計來避免它們,并可以使用按鈕來減慢時間。

在此項目中,我們使用Arduino創建了自定義控制器,將Unity和Uniduino配置為與其通信,并創建了一個簡單的控件。游戲進行測試。這里的概念幾乎可以應用于任何項目,甚至還有專門針對自定義控制器的游戲卡紙。

借助Arduino和Unity,您幾乎可以從任何東西創建自定義控制器。您是否創建了控制飛船的高保真音響?一個控制平臺游戲的烤面包機?

責任編輯:wv

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16385

    瀏覽量

    178382
  • Arduino
    +關注

    關注

    188

    文章

    6471

    瀏覽量

    187244
  • Unity
    +關注

    關注

    1

    文章

    127

    瀏覽量

    21837
收藏 人收藏

    評論

    相關推薦

    開放式激光振鏡運動控制器在Ubuntu+Qt下自定義圖形標刻

    開放式激光振鏡運動控制器在Ubuntu+Qt下自定義圖形標刻
    的頭像 發表于 10-08 10:45 ?670次閱讀
    開放式激光振鏡運動<b class='flag-5'>控制器</b>在Ubuntu+Qt下<b class='flag-5'>自定義</b>圖形標刻

    如何將自定義邏輯從FPGA/CPLD遷移到C2000?微控制器

    電子發燒友網站提供《如何將自定義邏輯從FPGA/CPLD遷移到C2000?微控制器.pdf》資料免費下載
    發表于 09-23 12:36 ?0次下載
    如何將<b class='flag-5'>自定義</b>邏輯從FPGA/CPLD遷移到C2000?微<b class='flag-5'>控制器</b>

    創建自定義的基于閃存的引導加載程序(BSL)

    電子發燒友網站提供《創建自定義的基于閃存的引導加載程序(BSL).pdf》資料免費下載
    發表于 09-19 10:50 ?0次下載
    創建<b class='flag-5'>自定義</b>的基于閃存的引導加載程序(BSL)

    如何自定義內存控制器的設置

    在FreeRTOS中自定義內存控制器的設置,主要涉及到內存分配策略的選擇和配置。FreeRTOS提供了多種內存分配策略,如heap_1、heap_2、heap_3、heap_4和heap_5,每種
    的頭像 發表于 09-02 14:28 ?515次閱讀

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃。
    的頭像 發表于 08-15 11:49 ?656次閱讀
    EtherCAT運動<b class='flag-5'>控制器</b>PT/PVT實現用戶<b class='flag-5'>自定義</b>軌跡規劃

    NVIDIA NeMo加速并簡化自定義模型開發

    如果企業希望充分發揮出 AI 的力量,就需要根據其行業需求量身定制的自定義模型。
    的頭像 發表于 07-26 11:17 ?768次閱讀
    NVIDIA NeMo加速并簡化<b class='flag-5'>自定義</b>模型開發

    如何為ESP8266構建自定義盾牌?

    我正在尋找某種如何為ESP8266構建自定義盾牌的指南。 到目前為止,我已經使用 NODEMCU 構建了功能原型,但我現在想簡化事情并使其更小。 1. 是否有一些書面的、開放的硬件指南 (很好
    發表于 07-08 07:17

    Chrome移動版支持自定義菜單欄功能

    在先前版本中,用戶通過點擊瀏覽右上角的三個點按鈕即可調出包含各類圖標與操作的菜單。而此次更新后,Chrome新增了“自定義菜單”選項,允許用戶自主控制該區域的展示內容。
    的頭像 發表于 05-27 15:00 ?833次閱讀

    HarmonyOS開發案例:【 自定義彈窗】

    基于ArkTS的聲明式開發范式實現了三種不同的彈窗,第一種直接使用公共組件,后兩種使用CustomDialogController實現自定義彈窗
    的頭像 發表于 05-16 18:18 ?1386次閱讀
    HarmonyOS開發案例:【 <b class='flag-5'>自定義</b>彈窗】

    TSMaster 自定義 LIN 調度表編程指導

    LIN(LocalInterconnectNetwork)協議調度表是用于LIN總線通信中的消息調度的一種機制,我們收到越來越多來自不同用戶希望能夠通過接口實現自定義LIN調度表的需求。所以在
    的頭像 發表于 05-11 08:21 ?693次閱讀
    TSMaster <b class='flag-5'>自定義</b> LIN 調度表編程指導

    HarmonyOS開發案例:【UIAbility和自定義組件生命周期】

    本文檔主要描述了應用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對于頁面
    的頭像 發表于 05-10 15:31 ?1264次閱讀
    HarmonyOS開發案例:【UIAbility和<b class='flag-5'>自定義</b>組件生命周期】

    微軟Dev Home應用提供自定義文件管理支持

    據悉,Microsoft 近期發布了 0.13 版 Dev Home 應用程序,除修復多項 BUG 外,還新增了自定義文件資源管理功能。該應用支持用戶在應用內創建虛擬機,利用微軟旗下的 Hyper V 技術生成本地虛擬機。
    的頭像 發表于 04-26 11:15 ?480次閱讀

    HarmonyOS開發實例:【自定義Emitter】

    使用[Emitter]實現事件的訂閱和發布,使用[自定義彈窗]設置廣告信息。
    的頭像 發表于 04-14 11:37 ?1014次閱讀
    HarmonyOS開發實例:【<b class='flag-5'>自定義</b>Emitter】

    鴻蒙ArkUI實例:【自定義組件】

    組件是 OpenHarmony 頁面最小顯示單元,一個頁面可由多個組件組合而成,也可只由一個組件組合而成,這些組件可以是ArkUI開發框架自帶系統組件,比如?`Text`?、?`Button`?等,也可以是自定義組件,本節筆者簡單介紹一下自定義組件的語法規范。
    的頭像 發表于 04-08 10:17 ?656次閱讀

    自定義PSoC6微控制器板上建立BLE連接,BLE啟動不起作用的原因?

    我正在嘗試在自定義 PSoC 6 微控制器板上建立 BLE 連接。 我正在使用一個適用于我的開發板的 BLE 示例項目。 布局包括兩個用于 BLE 的 ECO 和 WCO 晶體振蕩。 該程序一直
    發表于 02-01 07:10
    主站蜘蛛池模板: 一区二区三区四区国产| 果冻传媒剧情在线观看| 成人欧美尽粗二区三区AV| 囯产精品一品二区三区| 亚洲精品不卡在线| 用震蛋调教女性下面视频| 亚洲精品91| 538视频这里只有精品| 扒开美女的内衣亲吻漫画| 国产学生在线播放精品视频| 久久亚洲AV无码精品午色夜麻豆 | 免费国产成人高清在线观看视频| 日本湿姝在线观看| 世界上第一个得抑郁症的人是谁| 亚洲一级特黄| 边做边爱免费视频| 精品久久久久久久99热| 欧美一级黄色影院| 人人射人人插| 色吧.com| 亚久久伊人精品青青草原2020| 中文字幕亚洲欧美在线视频| 一个人看的HD免费高清视频| www.久艹| 久久99精品久久久久久园产越南| 日韩a视频在线观看| 九九热精品在线| 泰国淫乐园实录| 国产亚洲中文字幕视频| 一级淫片bbbxxx| 嗯啊好爽视频| 国产XXXXXX农村野外| 国产精品资源网站在线观看| 久久亚洲人成国产精品| 无码毛片内射白浆视频| 亚洲精品色婷婷在线蜜芽 | 亚洲日本欧美国产在线视| 1788vv视频| 大学生高潮无套内谢视频| 久青草国产在线视频亚瑟影视| 香蕉97超级碰碰碰碰碰久|