你有沒有想過設計自己的遊戲控制器?比你想象的容易!
在這個簡短的項目中,我們將建立一個簡單的自定義遊戲控制器與Unity遊戲引擎一起使用。這個控制器將由一個Arduino Uno提供動力,不過你也可以在這個項目中使用許多替代品中的一個。我們還將創建一個基本的遊戲,你將使用你的控制器,以避免下降的物體和減慢時間。
這些東西中的大多數都可以在Arduino初學者工具包中獲得。如果你沒有初學者工具包,請查看我們的指南,為你選擇最好的。
你可以使你的控制器複雜,你想,雖然在這個例子中,我們將設置一個電位器和一個按鈕-完美的控制一個簡單的街機遊戲。
設置你的實驗板和Arduino如下圖所示。這是什麼,我們將使用我們的遊戲控制器,雖然你可以使用幾乎完全相同的設置作為一個DIY的midi控制器太!
一旦你把所有的東西都連接好,通過USB連接你的Arduino。在Arduino軟件IDE中,指向Tools>;Board和Tools>;Port,選擇要使用的微控制器和端口。Arduino IDE附帶了我們需要的草圖,您可以在File>;Examples>;Firmata>;StandardFirmata下找到它。點擊上傳,你就可以開始了。
如果你是新來的Arduino和你的頭是融化輕微,看看我們的初學者指南,以幫助您得到它與您的計算機很好地交談。
在Unity中,打開窗口>;資產存儲,從Unity編輯器中訪問Unity的資產存儲。在資產庫中搜索Uniduino插件。這個插件將允許您接收和發送數據到和從您的Arduino引腳內團結。編寫時的插件價格為30美元。這是可以做這個項目,而不必購買插件,雖然它是相當複雜的,你可能會發現插件更方便全面。
這個視頻從創造者的插件帶你通過測試的過程中,一切都是工作的,隨著第一次安裝。請注意,您可能還需要在Windows上重置Unity編輯器。
我們可以用這個測試板來測試我們的控制器。將引腳D2設置為輸入和數字。再往下,將引腳A5設置為模擬。您的電位計和按鈕應該顯示在屏幕上的值旁邊的引腳編號現在。進步!
所以我們有一個控制器,但是我們應該控制什麼呢?嗯,可能性是無窮的,但今天我們將創建一個非常簡單的躲避遊戲來測試我們的新控制系統。我們將在遊戲設置移動相當快,所以如果你是一個全新的團結引擎,你可能會發現我們的團結遊戲編程初學者指南有用的得到你的方位。
我們將建立一個非常基本的遊戲,其中你的目標是躲避你的球體左右,以避免立方體下降,這將利用你的新定製控制器。
創建一個新場景,將Uniduino預置從Assets>;Uniduino>;預置拖動到您的層次結構中,並將Uniduino預置拖動到層次結構中。我們需要它在那裡做我們的遊戲和控制器之間的對話。
在Unity層次結構中,單擊Create>;Sphere並使用檢查器中的Transform選項卡將其移動到遊戲屏幕的底部。
現在為這個聚會添加一些代碼。在層次結構中選擇球體後,單擊其檢查器窗口底部的“添加組件”>;“新建腳本”。將其命名為spheremore並從下拉菜單中選擇C Sharp。單擊創建和添加,腳本將被添加到遊戲對象中。雙擊它打開腳本並輸入以下代碼:
using UnityEngine;using System.Collecti***;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 ****og 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、它的引腳和球體聲明瞭一些變量。我們還使用了
啟動並配置pins方法以在運行時初始化Arduino。讓我們保存我們的腳本,然後返回Unity編輯器,看看發生了什麼變化。
我們現在可以在Inspector窗口中看到公共變量。讓我們看看我們可以進入這個階段,以幫助我們以後。我們知道我們在Arduino上使用的密碼是什麼,我們可以輸入密碼。我們也從前面的實驗中知道我們希望我們的球體能夠左右移動多遠,這樣它就不會從屏幕上掉下來。現在輸入這些值。
是時候在Unity編輯器中實際查看Arduino的值了。現在,我們可以向spheremore腳本的Update函數添加一行代碼,然後再次保存腳本。
void Update (){ //We assign the value the arduino is reading from our potentionmeter to our potValue variable potValue = arduino.****ogRead(potPinNumber);}現在我們的potValue變量每一幀都在更新,我們可以在Unity檢查器中實時看到它的值。在進行測試之前,現在是檢查Uniduino插件是否在正確的端口上偵聽的好時機。在繼承者權限中單擊Uniduino,並在Inspector中檢查它的端口名。如果為空,請為Arduino填寫正確的端口號。在這種情況下,它是COM4,雖然它可能是不同的你。如果不確定,請檢查是否使用Arduino IDE。
在層次結構中選擇球體,然後單擊屏幕頂部的“播放”按鈕。系統需要幾秒鐘來初始化,然後當您移動電位計時,您應該開始在檢查器中看到電位計值變量的變化。
現在我們在談話!嚴格地說,團結和阿爾杜伊諾是在說話,但誰在數呢?如果到目前為止還沒有看到檢查器中的值更改,請檢查設置步驟,並確保為Arduino選擇了正確的端口。
現在我們更新了out potValue變量,我們想用這個值來移動球體。當電位計一直向左時,我們希望球**於屏幕的左側,反之亦然。統一體中的對象被定位在向量空間中的一個點上,這個點由它的屬性值決定變換位置. 在下圖中,球**於我們想要的最左邊的點,你可以看到它的位置向量是9.5,-4,0。
我們想要影響球體的X位置。不幸的是,直接使用電位計的值是行不通的,因為當電位計一直向左時,它會給出一個值0——這會把我們的球體放在屏幕的正中間。在另一個極端,電位計的最大值1023,會把立方體放在屏幕的右邊。沒用。我們需要的是一些數學。
對於那些害怕盯著一張寫滿荒謬數字的紙看的人(儘管有一些很棒的網站可以幫助你學習數學),不要害怕。我們需要一種方法使電位計的值與球體的X位置相對應。幸運的是,我們可以使用擴展方法。
擴展方法是為我們執行特定任務的腳本。在本例中,我們給它我們擁有的值,它返回映射到另一個的值,準備在spheremore腳本中使用。在“項目”面板的頂部,單擊“創建”>;“C#腳本”,並將其命名為ExtensionMethods。在腳本中輸入以下代碼:
using UnityEngine;using System.Collecti***;public static class ExtensionMethods { //our handy dandy Remapper functionpublic static float Remap (this float value, float from1, float to1, float from2, float to2) {return (value - from1) / (to1 - from1) * (to2 - from2) + from2;}}保存腳本,然後返回spheremore腳本。我們現在可以在Update函數的ExtensionMethods腳本中使用這個Remap函數,將電位計值轉換為遊戲中可用的值。在剛才分配potValue變量的位置下,鍵入以下內容:
提示告訴我們重映射需要兩組From和To值,並將它們映射到一起。我們可以把我們的價值觀融入其中。
mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);保存腳本,返回Unity編輯器,然後點擊play按鈕。現在您應該看到,當您移動電位計時,映射的Pot變量會發生變化,以與我們為左右邊緣確定的值相對應。花點時間坐下來感謝您的ExtensionMethods腳本。看不到計算器。
注意:如果您注意到您的值是相反的,所以當您的電位計是所有的方式正確您得到一個負值為您的映射鍋變量,您可能有您的電位計設置錯誤的方式。幸運的是,你不需要重新佈線就可以解決這個問題。您只需在重新映射值時切換它們:
現在我們終於有了可用的值。現在只需將這些值賦給球體的X位置:
//Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);保存腳本,返回Unity編輯器並按play。你現在應該能夠移動你的球體左右使用你的電位計!
既然我們的球體在移動,那麼當我們陷入困境時,有一種方法能讓事情慢一點不是很好嗎?我們將使用我們的按鈕來減慢我們遊戲中的時間。打開spheremore腳本,並將此代碼添加到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;現在我們有了遊戲的機制,讓我們添加一些障礙!我們將使用球體的天敵,立方體。在層次中,單擊“創建”>;“三維對象”>;“立方體”。在立方體的檢查器中,添加“組件”>;“物理”>;“剛體”。將剛體的阻力值設置為5。另外,在“檢查器”中的“長方體碰撞器”組件下,選擇“是觸發器”。這將使我們能夠探測到與球體的碰撞。
在多維數據集上創建一個腳本並將其稱為collideWithSphere,打開腳本並刪除Start和Update函數,因為我們這次不需要它們。輸入此代碼:
using UnityEngine;using System.Collecti***;public class collideWithSphere : MonoBehaviour{ void OnTriggerEnter(Collider other) { Destroy(other.gameObject); }}每當觸發器碰撞器碰撞到另一個碰撞器時,OnTriggerEnter就會發送一條消息。在這個例子中,我們告訴它去摧毀它碰到的任何東西。保存腳本並返回Unity編輯器。將多維數據集從層次結構拖動到“項目”面板。您將注意到層次結構中立方體的文本已變為藍色。這是因為我們已經創建了一個預製件並將其保存在我們的項目中。立即從層次結構中刪除多維數據集。
我們現在只需要一個腳本來生成立方體。在層次結構中,單擊“創建”>;“創建空”,然後在檢查器中將其重命名為Game Manager,並向其添加名為gameManager的腳本。打開腳本並添加以下代碼:
using UnityEngine;using System.Collecti***;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 initializationvoid 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 framevoid Update () {}}保存腳本。回到編輯器中,選擇層次結構中的遊戲管理器,並將多維數據集預製從項目面板拖動到檢查器中的多維數據集變量。在這裡也填寫你的產卵值。你可以隨意擺弄它,使它變得像你喜歡的那樣難或容易。請注意,讓你的最低的立方體足夠高以允許Uniduino初始化是值得的——在你能夠移動之前輸掉遊戲可能會令人沮喪!
現在當你按play鍵時,立方體將在你上方產卵並掉落。你可以用你的電位計來避免它們,用你的按鈕來減慢時間。
在這個項目中,我們創建了一個帶有Arduino的自定義控制器,配置Unity和Uniduino與之通信,並創建了一個簡單的遊戲來測試它。這裡的概念幾乎可以應用於任何項目,甚至還有專門用於定製控制器的遊戲阻塞。
使用Arduino和Unity,您幾乎可以從任何東西創建自定義控制器。你創造了一個控制宇宙飛船的高保真音響嗎?控制平臺遊戲的烤麵包機?
如果你做了這樣一個項目,我很想看看!把它貼在下面的評論裡!
...。隨著這門新語言的興起,DIY電子領域也蓬勃發展。來自Arduino和Raspberry Pi等公司的開發板和單板計算機改變了人們生產家用電子產品的方式。如果你能用Python程式設計一個Arduino,那不是很棒嗎? ...
免費鏡頭,也稱為鏡頭打擊,是一個簡單的技術:你“自由”的鏡頭從你的相機創造夢想般的照片。這是一個攝影的想法,甚至初學者可以嘗試一些簡單的50毫米的基本鏡頭。 ...
...何工作的基礎知識,並給出一些任何人都能做的簡單DIY Arduino專案的例子。 ...
微軟正在向所有人開放Xbox Live創作者計劃。Xbox Live創作者計劃允許任何人(有能力支付賬單)**影片遊戲並向大眾釋出。如果你願意,你甚至可以為你的作品收費。如果你覺得夠好的話。 ...
... 自定義指令碼語言。Godot使用拖放系統來維護場景元素,但是這些元素中的每一個都可以透過內建腳本系統進行擴充套件,該系統使用一種稱為GDScript的定製Python語言。它...
... 這款騎士led掃描器可以使用Arduino和一些簡單的元件構建。你需要寫一些程式碼,但是我們完整的教程涵蓋了你需要知道的一切。 ...