如何用arduino和unity制作自定义游戏控制器

你有没有想过设计自己的游戏控制器?比你想象的容易!...

你有没有想过设计自己的游戏控制器?比你想象的容易!

arduino-uno-game-controller

在这个简短的项目中,我们将建立一个简单的自定义游戏控制器与Unity游戏引擎一起使用。这个控制器将由一个Arduino Uno提供动力,不过你也可以在这个项目中使用许多替代品中的一个。我们还将创建一个基本的游戏,你将使用你的控制器,以避免下降的物体和减慢时间。

对于这个项目,你需要

  • Arduino或类似微控制器
  • 1 x 10k欧姆电阻器
  • 1个瞬时开关
  • 1个电位计
  • 连接电线
  • 试验板
  • 统一游戏引擎
  • Unity Asset Store的Uniduino插件(30美元)
  • 完整的项目代码,以防你不想写出来(不包括Uniduino插件)

这些东西中的大多数都可以在Arduino初学者工具包中获得。如果你没有初学者工具包,请查看我们的指南,为你选择最好的。

你可以使你的控制器复杂,你想,虽然在这个例子中,我们将设置一个电位器和一个按钮-完美的控制一个简单的街机游戏。

Custom Controller Breadboard 670

组装控制器

设置你的实验板和Arduino如下图所示。这是什么,我们将使用我们的游戏控制器,虽然你可以使用几乎完全相同的设置作为一个DIY的midi控制器太!

Fritzing Diagram Annotated

准备你的arduino

一旦你把所有的东西都连接好,通过USB连接你的Arduino。在Arduino软件IDE中,指向Tools>Board和Tools>Port,选择要使用的微控制器和端口。Arduino IDE附带了我们需要的草图,您可以在File>Examples>Firmata>StandardFirmata下找到它。点击上传,你就可以开始了。

如果你是新来的Arduino和你的头是融化轻微,看看我们的初学者指南,以帮助您得到它与您的计算机很好地交谈。

设置unity项目

在Unity中,打开窗口>资产存储,从Unity编辑器中访问Unity的资产存储。在资产库中搜索Uniduino插件。这个插件将允许您接收和发送数据到和从您的Arduino引脚内团结。编写时的插件价格为30美元。这是可以做这个项目,而不必购买插件,虽然它是相当复杂的,你可能会发现插件更方便全面。

Unity Asset Store Uniduino

这个视频从创造者的插件带你通过测试的过程中,一切都是工作的,随着第一次安装。请注意,您可能还需要在Windows上重置Unity编辑器。

我们可以用这个测试板来测试我们的控制器。将引脚D2设置为输入和数字。再往下,将引脚A5设置为模拟。您的电位计和按钮应该显示在屏幕上的值旁边的引脚编号现在。进步!

Uniduino Test

现在做些我们能控制的事情

所以我们有一个控制器,但是我们应该控制什么呢?嗯,可能性是无穷的,但今天我们将创建一个非常简单的躲避游戏来测试我们的新控制系统。我们将在游戏设置移动相当快,所以如果你是一个全新的团结引擎,你可能会发现我们的团结游戏编程初学者指南有用的得到你的方位。

我们将建立一个非常基本的游戏,其中你的目标是躲避你的球体左右,以避免立方体下降,这将利用你的新定制控制器。

创建一个新场景,将Uniduino预置从Assets>Uniduino>预置拖动到您的层次结构中,并将Uniduino预置拖动到层次结构中。我们需要它在那里做我们的游戏和控制器之间的对话。

在Unity层次结构中,单击Create>Sphere并使用检查器中的Transform选项卡将其移动到游戏屏幕的底部。

Inspector Sphere X Position

是时候开始编码了

现在为这个聚会添加一些代码。在层次结构中选择球体后,单击其检查器窗口底部的“添加组件”>“新建脚本”。将其命名为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编辑器,看看发生了什么变化。

Sphere Mover Script With Empty Variables

我们现在可以在Inspector窗口中看到公共变量。让我们看看我们可以进入这个阶段,以帮助我们以后。我们知道我们在Arduino上使用的密码是什么,我们可以输入密码。我们也从前面的实验中知道我们希望我们的球体能够左右移动多远,这样它就不会从屏幕上掉下来。现在输入这些值。

Sphere Mover Script With Variables

生命的最初迹象

是时候在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。

Uniduino Check Port Is Correct

在层次结构中选择球体,然后单击屏幕顶部的“播放”按钮。系统需要几秒钟来初始化,然后当您移动电位计时,您应该开始在检查器中看到电位计值变量的变化。

Signs of Life 2

现在我们在谈话!严格地说,团结和阿尔杜伊诺是在说话,但谁在数呢?如果到目前为止还没有看到检查器中的值更改,请检查设置步骤,并确保为Arduino选择了正确的端口。

让我们移动这个球体

现在我们更新了out potValue变量,我们想用这个值来移动球体。当电位计一直向左时,我们希望球**于屏幕的左侧,反之亦然。统一体中的对象被定位在向量空间中的一个点上,这个点由它的属性值决定变换位置. 在下图中,球**于我们想要的最左边的点,你可以看到它的位置向量是9.5,-4,0。

Transform Example 670

我们想要影响球体的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脚本。看不到计算器。

Mapped Pot

注意:如果您注意到您的值是相反的,所以当您的电位计是所有的方式正确您得到一个负值为您的映射锅变量,您可能有您的电位计设置错误的方式。幸运的是,你不需要重新布线就可以解决这个问题。您只需在重新映射值时切换它们:

Switch Remap

现在我们终于有了可用的值。现在只需将这些值赋给球体的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初始化是值得的——在你能够移动之前输掉游戏可能会令人沮丧!

Game Manager

完成的项目

现在当你按play键时,立方体将在你上方产卵并掉落。你可以用你的电位计来避免它们,用你的按钮来减慢时间。

在这个项目中,我们创建了一个带有Arduino的自定义控制器,配置Unity和Uniduino与之通信,并创建了一个简单的游戏来测试它。这里的概念几乎可以应用于任何项目,甚至还有专门用于定制控制器的游戏阻塞。

使用Arduino和Unity,您几乎可以从任何东西创建自定义控制器。你创造了一个控制宇宙飞船的高保真音响吗?控制平台游戏的烤面包机?

如果你做了这样一个项目,我很想看看!把它贴在下面的评论里!

  • 发表于 2021-03-17 05:47
  • 阅读 ( 583 )
  • 分类:IT

你可能感兴趣的文章

gdc showcase 2021以主要游戏开发玩家为特色

...,在主题区域结识新朋友,玩独立游戏、复古游戏、替代控制器等等。 ...

  • 发布于 2021-03-10 22:40
  • 阅读 ( 466 )

如何用python编程和控制arduino

...。随着这门新语言的兴起,DIY电子领域也蓬勃发展。来自Arduino和Raspberry Pi等公司的开发板和单板计算机改变了人们生产家用电子产品的方式。如果你能用Python编程一个Arduino,那不是很棒吗? ...

  • 发布于 2021-03-11 16:20
  • 阅读 ( 880 )

如何用arduino遥控你的家,5个diy项目

...何工作的基础知识,并给出一些任何人都能做的简单DIY Arduino项目的例子。 ...

  • 发布于 2021-03-13 11:21
  • 阅读 ( 281 )

用unity编写游戏:初学者指南

...选择。统一是如此灵活,你甚至可以使自己的自定义游戏控制器与一点DIY的诀窍! ...

  • 发布于 2021-03-13 11:55
  • 阅读 ( 233 )

统一学习是掌握游戏开发最简单的方法

...平台有一个很大的在线教师社区,但是统一学习是学习如何用软件**游戏的新的官方方式。 ...

  • 发布于 2021-03-19 21:05
  • 阅读 ( 252 )

8个免费的游戏开发软件工具,让你自己的游戏

... 自定义脚本语言。Godot使用拖放系统来维护场景元素,但是这些元素中的每一个都可以通过内置脚本系统进行扩展,该系统使用一种称为GDScript的定制Python语言。它很容易学...

  • 发布于 2021-03-22 21:13
  • 阅读 ( 354 )

15个优秀的arduino初学者项目

... 2arduino midi控制器 ...

  • 发布于 2021-03-23 11:30
  • 阅读 ( 355 )

如何用这10个diy项目为你的旧车添加智能功能

... 这款骑士led扫描仪可以使用Arduino和一些简单的组件构建。你需要写一些代码,但是我们完整的教程涵盖了你需要知道的一切。 ...

  • 发布于 2021-03-24 08:58
  • 阅读 ( 253 )

如何用游戏控制器和arduino控制机器人

...将探索一种创造性的方法来控制伺服使用处理,和Xbox360控制器。如果你已经相当精通游戏开发,你可能会对我们的自定义游戏控制器教程感兴趣,它使用Unity。 ...

  • 发布于 2021-03-25 23:05
  • 阅读 ( 323 )

今天学习如何用这些命令编程arduino板

... 幸运的是,Arduino板使整个过程更加容易。一系列的板是可用的,所有可编程使用Arduino IDE和Arduino编码库。 ...

  • 发布于 2021-03-30 06:10
  • 阅读 ( 272 )
axii8004917
axii8004917

0 篇文章

相关推荐