VS2015のソリューションエクスプローラーの「参照」で右クリック→「参照の追加」を選択する。表示される、参照マネージャーから、「Universal Windows」→「拡張」を選択して表示されるSDKリストから、「Windows IoT Extension for the UWP 10.0.10240.0」にチェックを入れる(図2)。選んだAPIがソリューションエクスプローラーの「参照」内に追加される。
ソリューションエクスプローラーから「JumpScript.cs」ファイルを開く。最初はエラーを示す赤い波線が幾つか表示されるが、気にしなくてもいい。
前述したリスト1のコードを追記修正する(リスト2)。
using UnityEngine; using System; using Windows.Devices.Gpio; public class JumpScript : MonoBehaviour { //private GameObject obj; private bool flag=false; private Animator anim; private const int LED_PIN = 79; private const int BUTTON_PIN = 97; private GpioPin pin; private GpioPin buttonPin; private GpioPinValue pinValue = GpioPinValue.High; // Use this for initialization void Start() { anim = GetComponent<Animator>(); InitGPIO(); } void Update() { if (flag==true) { anim.SetBool("is_jumping", true); } else { AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); if (state.IsName("Locomotion.Jump")) { anim.SetBool("is_jumping", false); } } } private void InitGPIO() { var gpio = GpioController.GetDefault(); if (gpio == null) { return; } buttonPin = gpio.OpenPin(BUTTON_PIN); pin = gpio.OpenPin(LED_PIN); pin.Write(GpioPinValue.High); pin.SetDriveMode(GpioPinDriveMode.Output); if (buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp); else buttonPin.SetDriveMode(GpioPinDriveMode.Input); buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50); buttonPin.ValueChanged += buttonPin_ValueChanged; } private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) { if (e.Edge == GpioPinEdge.FallingEdge) { pinValue = (pinValue == GpioPinValue.Low) ? GpioPinValue.High : GpioPinValue.Low; pin.Write(pinValue); if(pinValue==GpioPinValue.High) { flag = true; }else { flag = false; } } } }
追記修正した「JumpScript.cs」のポイントは以下の通りだ。
ユーザーモードの汎用入出力(GPIO)ピンを使うための型を含むWindows.Devices.Gpio名前空間を読み込む。
ブール型メンバー変数flag、Animatorクラス型のメンバー変数animを宣言する。
赤いジャンパーワイヤーの1つは、SODIMM_79(GPIO)につないであるので、メンバー定数LED_PINを宣言して「79」の値で初期化する(Raspberry Pi 3の場合は「6」となる)。
タクトスイッチは、もう1本の赤色のジャンパーワイヤーを経由してSODIMM_97(GPIO)とつながっているので、BUTTON_PINを「97」で初期化しておく(Raspberry Pi 3の場合は「5」となる)。
GpioPinクラスのメンバー変数pinとbuttonPin、汎用入出力「GPIO」ピンの可能な値を表す列挙体メンバー変数となるGpioPiValue型のpinValueを宣言する。
Animatorコンポーネントを作成して、メンバー変数animで参照しておく。また、GPIOピンを初期化するInitGPIO()メソッドを実行する。
ブール型メンバー変数の値がtrueならばジャンプする、そうでなければジャンプしないとするコードを記入する。このUpdate()メソッドは常に呼び出されており、タクトスイッチを押すアクションでflag変数の値を変化させている。
GPIOControllerクラスを使ってGPIOを取得し、OpenPinメソッドでLEDのGPIOを開く。Toradexでは「79」ピンになる。また、タクトスイッチのGPIOも開く、この場合は「97」になる。
最初にHIGH値を書き込むことで、オフ状態時にLEDを初期化するようにする。続いて、入力プルアップ抵抗がサポートされているかどうかを確認する。
ボタンを押したときのスイッチバウンスノイズを除去するために、デバウンスタイムアウトを設定。ボタンピンに、ValueChangedでbuttonPin_ValueChangedイベントに登録する。これが、ボタンが押されたときに呼び出される。
buttonValue_Changedは、タクトスイッチを押すたびに呼び出されるメソッドとなる。GPIOがHIGH→LOWに変化する処理を行い、HIGH(電流が流れる場合)のときに、メンバー変数flagをtrueで初期化し、それ以外の場合はfalseで初期化する。
この処理によって、タクトスイッチを押す動作で、LEDが点灯し、キャラクターがジャンプをする動きを制御できるようになる。タクトスイッチをオフにすると、LEDが消える処理とともに、キャラクターがジャンプする処理も停止する。
Copyright © ITmedia, Inc. All Rights Reserved.