ArduinoとUnityでカスタムゲームコントローラーを作成する方法

ArduinoとUnityでカスタムゲームコントローラーを作成する方法

独自のゲームコントローラーを設計したいと思ったことはありませんか?思ったより簡単です!





この短いプロジェクトでは、Unityゲームエンジンで使用する簡単なカスタムゲームコントローラーを作成します。このコントローラーはArduinoUnoを搭載していますが、このプロジェクトでも多くの選択肢の1つを使用できます。また、コントローラーを使用してオブジェクトの落下を回避し、時間を遅くする基本的なゲームも作成します。





このプロジェクトには必要になります

  • Arduinoまたは同様のマイクロコントローラー
  • 1 x10kオーム抵抗
  • 1xモーメンタリスイッチ
  • 1xポテンショメータ
  • フックアップワイヤー
  • ブレッドボード
  • Unityゲームエンジン
  • Unity Asset StoreのUniduinoプラグイン($ 30)
  • 書きたくない場合に備えて、完全なプロジェクトコード(Uniduinoプラグインは含まれていません)

これらのほとんどは、Arduinoスターターキットで入手できます。スターターキットをお持ちでない場合は、最適なキットを選択するためのガイドをご覧ください。





コントローラは必要に応じて複雑にすることができますが、この例では、ポテンショメータとボタンを設定します。これは、単純なアーケードゲームの制御に最適です。

コントローラの組み立て

下の画像に示すように、ブレッドボードとArduinoをセットアップします。これは、ゲームコントローラーとして使用するものですが、ほぼ同じセットアップを使用できます。 DIYMIDIコントローラー それも!



Arduinoの準備

すべてを配線したら、USB経由でArduinoを接続します。 ArduinoソフトウェアIDEで ツール>ボードツール>ポート 使用しているマイクロコントローラーとポートを選択します。 Arduino IDEには、必要なスケッチがバンドルされており、以下で見つけることができます。 ファイル>例> Firmata> StandardFirmata 。 [アップロード]をクリックすると、準備が整います。

Arduinoを初めて使用し、頭が少し溶けている場合は、 ビギナーズガイド あなたがそれをあなたのコンピュータとうまく話せるようにするのを助けるために。





Unityプロジェクトのセットアップ

Unityで、 ウィンドウ>アセットストア Unityエディター内からUnityのアセットストアにアクセスします。アセットストアでUniduinoプラグインを検索します。このプラグインを使用すると、Unity内のArduinoピンとの間でデータを送受信できます。執筆時点でのプラグインの価格は30ドルです。 可能です プラグインを購入せずにこのプロジェクトを実行することは、かなり複雑であり、プラグインが全体的に便利であることがわかる場合があります。

プラグインの作成者からのこのビデオでは、すべてが機能していることをテストするプロセスと、最初のセットアップについて説明します。 WindowsでUnityエディターをリセットする必要がある場合もあることに注意してください。





これと同じテストパネルを使用して、コントローラーをテストできます。ピンD2をINPUTおよびDigitalに設定します。さらに下に、ピンA5をANALOGに設定します。ポテンショメータとボタンは、画面のピン番号の横に値を表示するはずです。進捗!

今、私たちが制御できるものを作るために

コントローラーがありますが、何を制御しますか?可能性は無限大ですが、今日は、新しい制御システムをテストするための非常に単純な回避ゲームを作成します。ゲームのセットアップを非常に迅速に進めますので、Unityエンジンをまったく使用したことがない場合は、 Unityゲームプログラミングビギナーズガイド あなたの方位を取得するのに便利です。

球体を左右にかわして立方体の落下を防ぐという非常に基本的なゲームを作成します。これは、新しく作成したカスタムコントローラーを利用します。

新しいシーンを作成し、Uniduinoプレハブをからドラッグします アセット> Uniduino>プレハブ 階層に挿入し、Uniduinoプレハブを階層にドラッグします。ゲームとコントローラーの間の会話を行うために、そこで必要です。

Unity階層でクリック 作成>球 インスペクターの[変換]タブを使用して、ゲーム画面の下部に移動します。

コーディングを取得する時が来ました

次に、このパーティにコードを追加します。階層で球を選択した状態で、をクリックします コンポーネントの追加>新しいスクリプト インスペクターウィンドウの下部にあります。それに名前を付けます sphereMover 選択します Cシャープ ドロップダウンメニューから。クリック 作成して追加 スクリプトが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のいくつかの変数を宣言しました。私達はまた使用しました

実行時にArduinoを初期化するためのStartメソッドとConfigurePinsメソッド。スクリプトを保存し、Unityエディターに戻って何が変更されたかを確認しましょう。

これで、インスペクターウィンドウにパブリック変数が表示されます。後で役立つように、この段階で何を入力できるかを見てみましょう。以前のビルドからArduinoで使用しているピンがわかっているので、それらを入力できます。また、以前の実験から、球が画面から落ちないように、球を左右にどれだけ移動できるようにするかがわかっています。これらの値を入力してみましょう。

人生の最初の兆候

Unityエディター内でArduinoからの値を実際に確認する時が来ました。今のところ、sphereMoverスクリプトのUpdate関数に1行のコードを追加して、スクリプトを再度保存できます。

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

これで、potValue変数がフレームごとに更新されるようになったので、Unityインスペクターでその値をリアルタイムで確認できます。テストを行う前に、Uniduinoプラグインが正しいポートでリッスンしていることを確認する良い機会です。階層内のUniduinoをクリックし、インスペクターでポート名を確認します。空白の場合は、Arduinoの正しいポート番号を入力してください。この場合はCOM4でしたが、あなたにとっては異なるかもしれません。よくわからない場合は、ArduinoIDEを使用して確認してください。

階層内で球を選択し、画面上部の[再生]ボタンをクリックします。システムの初期化には数秒かかります。その後、ポテンショメータを動かすと、インスペクタでポット値変数の変化が見られるようになります。

今話している!まあ、厳密に言えば、UnityとArduinoが話しているのですが、誰が数えているのでしょうか?ここまで進んでもインスペクターで値の変化が見られない場合は、セットアップ手順を確認し、Arduino用に正しいポートが選択されていることを確認してください。

この球を動かそう

更新されているpotValue変数がなくなったので、この値を使用して球を移動します。ポテンショメータが左端まである場合、球を画面の左側に配置します。その逆も同様です。 Unityのオブジェクトは、その値によって決定されるベクトル空間のポイントに配置されます。 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が2セットのFrom値とTo値を取り、それらを一緒にマップすることを示しています。これに値を入力できます。

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

スクリプトを保存し、Unityエディターに戻って、再生ボタンを押します。これで、ポテンショメータを動かすと、マップされたポット変数が変化し、左端と右端に対して決定した値に対応することがわかります。少し時間を取って、ExtensionMethodsスクリプトに感謝します。電卓は見えません。

注:値が逆になっていることに気付いた場合、ポテンショメータが右端にあると、マップポット変数の値が負になり、ポテンショメータの設定が間違っている可能性があります。幸い、再配線せずにこれを修正できます。再マップするときに値を切り替えるだけです。

これで、ようやく使用可能な値が得られました。あとは、これらの値を球のX位置に割り当てるだけです。

Photoshopでテキストにアウトラインを付ける方法
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

スクリプトを保存し、Unityエディターに戻って再生を押します。これで、ポテンショメータを使用して球を左右に移動できるようになります。

ボタンを機能させる

球体が動いたので、狭い場所に着いたときに物事を少し遅くする方法があるといいのではないでしょうか。ボタンを使用して、ゲームの時間を遅くします。 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に設定します。また、インスペクタのボックスコライダーコンポーネントで、[トリガー]を選択します。これにより、球との衝突を検出できるようになります。

キューブ上にスクリプトを作成し、それを呼び出します collideWithSphere 、スクリプトを開き、開始関数と更新関数を削除します。今回は必要ないためです。このコードを入力してください:

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

OnTriggerEnterは、トリガーコライダーが別のコライダーにヒットするたびにメッセージを送信します。この例では、触れたものは何でも破壊するように指示しています。スクリプトを保存して、Unityエディターに戻ります。キューブを階層からプロジェクトパネルにドラッグします。階層内の立方体のテキストが青色に変わったことに気付くでしょう。これは、プレハブを作成してプロジェクトに保存したためです。ここで、階層からキューブを削除します。

今必要なのは、キューブをスポーンするスクリプトだけです。階層でクリック 作成>空を作成 、インスペクターで名前をGame Managerに変更し、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 {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

スクリプトを保存します。エディターに戻り、階層内のゲームマネージャーを選択し、キューブプレハブをプロジェクトパネルからインスペクターのキューブ変数にドラッグします。ここにもスポーンの値を入力します。あなたはそれを好きなだけ難しくしたり簡単にしたりするためにそれをいじることができます。 Uniduinoが初期化できるように、最も低いキューブを十分に高くスポーンさせることは価値があることに注意してください。移動する前にゲームに負けるとイライラする可能性があります。

完成したプロジェクト

これで、再生を押すと、立方体があなたの上にスポーンして落下します。ポテンショメータを使用してそれらを回避し、ボタンを使用して時間を遅くすることができます。

このプロジェクトでは、Arduinoを使用してカスタムコントローラーを作成し、UnityとUniduinoを構成して通信し、簡単なゲームを作成してテストしました。ここでの概念は、ほとんどすべてのプロジェクトに適用できます。 カスタムコントローラーに特化したゲームジャム

ArduinoとUnityを使用すると、ほとんど何からでもカスタムコントローラーを作成できます。宇宙船を制御するHi-Fiを作成しましたか?プラットフォームゲームを制御するトースター?

あなたがこのようなプロジェクトを作ったなら、私はそれを見たいです!以下のコメントに投稿してください!

共有 共有 つぶやき Eメール 6つの可聴の選択肢:最高の無料または安価なオーディオブックアプリ

オーディオブックにお金をかけたくない場合は、無料で合法的にオーディオブックを聴くことができる優れたアプリをいくつか紹介します。

次を読む
関連トピック
  • DIY
  • プログラミング
  • Arduino
  • ゲームコントローラ
  • ゲーム開発
著者について イアン・バックリー(216件の記事が公開されました)

Ian Buckleyは、ドイツのベルリンに住むフリーランスのジャーナリスト、ミュージシャン、パフォーマー、ビデオプロデューサーです。マッドサイエンティストになることを期待して、執筆中やステージ上にいないときは、DIYの電子機器やコードをいじっています。

イアン・バックリーのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください
カテゴリ Diy