\r\n\r\n

arduinoとunityを使ったカスタムゲームコントローラの作り方

ゲームのコントローラーを自分でデザインしてみたいと思ったことはありませんか?

ゲームコントローラーを自分でデザインしてみたいと思ったことはありませんか?意外と簡単ですよ。

この短いプロジェクトでは、Unityゲームエンジンで使用するシンプルなカスタムゲームコントローラーを作成します。このコントローラはArduino Unoで駆動されますが、このプロジェクトでは多くの代替品を使用することもできます。また、コントローラーを使って落下物を避けたり、時間を遅くしたりする基本的なゲームも作成する予定です。

このプロジェクトに必要なものは

  • Arduinoまたは類似のマイクロコントローラ
  • 10kΩ抵抗×1
  • モメンタリースイッチ1個
  • ポテンショメーター1個
  • 接続用ワイヤー
  • テストパネル
  • ユニファイドゲームエンジン
  • Unity Asset Store用プラグイン「Uniduino」(30ドル)
  • 書き出したくない場合のために、完全なプロジェクトコード(Uniduinoプラグインを除く)

これらのほとんどは、Arduino Starter Kitで入手可能です。初心者向けキットをお持ちでない方は、自分に最適なキットを選ぶためのガイドをご覧ください。

この例では、ポテンショメーターとボタンという、簡単なアーケードゲームを操作するのに最適なものを設定しますが、コントローラーはいくらでも複雑にすることが可能です。

コントローラーの組み立て

下の写真のようにラボボードとArduinoをセットアップしてください。これは、ゲームコントローラーに使用するものですが、DIYのMIDIコントローラーとほぼ同じセットアップも可能です。

arduinoを準備する

ArduinoのIDEで、Tools> Board and Tools> Portを開き、使用するマイコンとポートを選択します。Arduino IDEには、File&gt.にある必要なスケッチが付属しています。例> Firmata> StandardFirmataの下にあるものです。アップロードをクリックすると、準備完了です。

Arduinoの初心者で、頭が少し溶けている方は、このビギナーズガイドを見て、コンピュータとうまく会話できるようになりましょう。

Unityプロジェクトの立ち上げ

UnityのエディタからUnityのアセットストアにアクセスするには、Unityのウィンドウ > Asset Storeを開いてください。アセットストアでUniduinoプラグインを検索してください。このプラグインを使うと、Arduinoのピンの中でUnityとデータの送受信ができるようになります。執筆時点でのプラグインの価格は30ドルです。このプロジェクトは、プラグインを購入しなくても可能ですが、かなり複雑なので、全面的にプラグインの方が便利だと思うかもしれません。

プラグインの作成者によるこのビデオは、テストプロセスを経て、すべてが最初のインストールと一緒に動作します。なお、Windowsの場合、Unityエディターのリセットが必要な場合があります。

このテストボードを使用して、コントローラをテストすることができます。D2 端子を入力、デジタルに設定します。さらにその下、A5ピンをアナログに設定します。ポテンショメーターとボタンが、画面上のピン番号の値の横に表示されるようになりました。進化している!?

今、私たちがコントロールできることをする

では、コントローラーはあっても、何をコントロールすればいいのでしょうか?さて、可能性は無限大ですが、今日は新しいコントロールシステムをテストするために、非常にシンプルなドッジゲームを作成します。Unityエンジンが初めての方は、「Unityゲームプログラミング入門」が参考になると思います。

新しいカスタムコントローラーを活用して、キューブが落下しないように球体を左右にかわすことを目的とした、非常に基本的なゲームを構築する予定です。

新しいシーンを作成し、Assets> Uniduino> presetsからUniduinoプリセットを階層にドラッグしてください。ゲームとコントローラーの間を取り持つ存在として、必要なのです。

Unityの階層で、Create> Sphereをクリックし、InspectorのTransformタブでゲーム画面の一番下に移動させます。

今こそコーディングを始める時

では、このパーティーにコードを追加してください。球体を階層的に選択した状態で、そのインスペクタウィンドウの下部にある「コンポーネントの追加 >新規スクリプト」をクリックします。spheremoreと名付け、ドロップダウンメニューからC Sharpを選択します。Create and Addをクリックすると、スクリプトがゲームオブジェクトに追加されます。それをダブルクリックしてスクリプトを開き、次のコードを入力します。

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とそのピン、球体に関するいくつかの変数を宣言しました。を使用したこともあります。

Arduinoを実行時に初期化するために、pinsメソッドを起動して設定します。スクリプトを保存してから、Unityエディタに戻って、何が変わったかを確認しましょう。

これで、インスペクタウィンドウにパブリック変数が表示されるようになりました。このステージで得たものを、後に役立てよう。Arduinoで使っているパスワードがわかっているので、それを入力すればいいのです。また、前回の実験で、球体が画面から落ちないように、左右にどの程度動けばいいのかもわかっています。ここで、これらの値を入力します。

生命の最初の徴候

実際にUnityエディタでArduinoの値を表示するところです。ここで、球体スクリプトの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を使用しているかどうか確認してください。

階層にある球体を選択し、画面上部の「再生」ボタンをクリックします。システムが初期化されるまで数秒かかり、その後ポテンショメーターを動かすと、インスペクターのポテンショメーター値変数に変化が現れ始めるはずです。

今、私たちは話しているんだ!技術的にはUnityとArduinoが話しているのですが、誰がカウントしているのでしょうか?ここまででチェッカーの値が変化していない場合は、設定手順を確認し、Arduinoのポートが正しく選択されていることを確認してください。

この球体を動かしてみよう

これでout potValue変数が更新されましたので、この値を使ってボールを動かしてみたいと思います。ポテンショメーターが左一杯のときは、ボール**が画面の左側に来るようにし、その逆のときは、ボール**が画面の右側に来るようにします。ユニティ内のオブジェクトは、そのプロパティ値の変換位置で決まるベクトル空間の点に配置される。下の図では、ボール**は一番左に位置したいところに置かれていて、その位置ベクトルは9.5, -4, 0であることがわかります。

球体のXの位置に影響を与えたい。ポテンショメーターの値をそのまま使ってもうまくいきません。ポテンショメーターを左いっぱいにすると、値が0になり、球体が画面の真ん中に来てしまうからです。逆に、最大値が1023のポテンショメーターでは、キューブが画面の右側に表示される。うまくいかないんです。必要なのは数学だ。

Unityがやってくれるなら、なぜ数学をやるのか?

とんでもない数字がびっしり書かれた紙を見つめるのが怖いという方(数学の勉強になる素晴らしいサイトもありますが)、ご安心ください。ポテンショメーターの値を球体のX位置に対応させる方法が必要です。幸いなことに、拡張メソッドを使うことができます。

拡張メソッドは、特定のタスクを実行してくれるスクリプトです。この場合、今持っている値を渡すと、別の値にマッピングされた値が返され、球体スクリプトですぐに使えるようになる。プロジェクトパネルの上部にある「Create> C# Script」をクリックし、「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;}}

スクリプトを保存して、スフィアモアのスクリプトに戻ります。このRemap関数をUpdate関数のExtensionMethodsスクリプトで使うことで、ポテンショメーターの値をゲームで利用可能な値に変換できるようになりました。先ほど変数potValueを代入した場所の下に、次のように入力します。

ヒントは、再マッピングにはFromとToの値の2つのセットが必要で、それらをマッピングすることで値を取り込むことができることを教えてくれています。

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

スクリプトを保存して、Unityエディタに戻り、再生ボタンをクリックします。ポテンショメーターを動かすと、マッピングされた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エディタに戻って再生ボタンを押すと、ポテンショメータを使って球体を動かせるようになるはずです。

ボタンを押すと動作開始

球体は動いているのだから、マンネリ化したときに少しスローダウンする方法があってもいいのでは?ボタンを使って、ゲームの時間を遅くする。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;

さて、ゲームの仕組みがわかったところで、障害物を追加してみましょう。球体の天敵である立方体を使うことにします。階層の中の「作成」 > 「3Dオブジェクト」 > 「立方体」をクリックします。キューブのインスペクタで、「コンポーネント」 > 「物理」 > 「リジッドボディ」を追加します。また、インスペクタの「Rectangular collider」コンポーネントで、「Yes trigger」を選択します。これにより、球体との衝突を検出することができるようになります。

多次元データセットにスクリプトを作成し、collideWithSphereと名付けます。スクリプトを開き、StartとUpdate関数は今回は必要ないので削除してください。このコードを入力してください。

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

OnTriggerEnterは、トリガーのコライダーが他のコライダーと衝突するたびにメッセージを送信します。この例では、触れたものをすべて破壊するように指示しています。スクリプトを保存して、Unityエディタに戻ります。多次元データセットを階層からプロジェクトパネルにドラッグする。階層内のキューブの文字が青色に変わっているのがわかると思います。これは、プレハブ部品を作成し、プロジェクトに保存しているためです。多次元データセットを階層から即座に削除する。

あとは、キューブを生成するスクリプトが必要なだけです。階層で、Create > Create Emptyをクリックし、Inspectorで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の初期化ができるように、最低のキューブを十分に高くすることは価値があることに注意してください。

終了したプロジェクト

これで、再生ボタンを押すと、キューブが生成され、頭上に落ちてきます。ポテンショメーターで回避し、ボタンで時間を遅らせることができます。

このプロジェクトでは、Arduinoでカスタムコントローラを作成し、UnityとUniduinoが通信できるように設定し、それをテストするための簡単なゲームを作成しました。ここにあるコンセプトは、ほとんどすべてのプロジェクトに適用でき、カスタムコントローラブロッキングに特化したゲームも存在します。

ArduinoとUnityを使えば、ほとんどあらゆるものからカスタムコントローラを作ることができます。宇宙船をコントロールするハイファイを作った?プラットフォームゲームを操作するトースター?

こんな企画をしたら、ぜひ見てみたい! 下のコメント欄に投稿してください。

  • 2021-03-17 05:47 に公開
  • 閲覧 ( 47 )
  • 分類:IT

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ