はじめに
皆さんは、Unityと脳波デバイスを連携させて、脳波を使ったゲームを開発したいと思ったことはないでしょうか?脳波デバイスをゲームのインターフェースとして使えば、プレイヤーの精神状態に合わせた演出や、魔法のような操作体験を提供することができそうですよね。GB Focus アプリの「UDP計測」と FocusCalm™️を用いれば、Unityで簡単に脳波を活用したゲームを作ることができます。
GB Focus と Unity の連携の仕組み
GB Focusの「UDP計測」は、Open Sound Control (OSC) 方式でデータを送受信しています。OSCは、電子楽器とコンピュータの間で演奏データをリアルタイムで送受信する規格です。VR Chat に導入されたことをきっかけに、VRでも利用されるようになっています。OSC Jack という Unity のプラグインを利用すれば、OSCを介して脳波計測データをUnityに送信することができます。
本記事で解説する項目
本記事では、GB FocusのUDP計測とUnityを連携させ、脳波を活用したゲームを作る方法を紹介します。
下記の手順で進めていきます。
- Unity プロジェクトの作成
- OSC Jack VS のインストールとセットアップ
- GB Focus と Unity を連携させる
- GB Focus から取得した数値でオブジェクトを操作してみる
とりあえず動かしてみたいという方は、作成済みのUnityプロジェクトを以下からダウンロード可能です。
環境
- PC: MacBook Air M1 2020
- OS: Sonoma 14.2.1
- Unity: 2021.3.30f1 (2021.3以降が必要です)
プロジェクトの作成
「New project」から、新しいプロジェクトを作成します。今回は「3D」を選択し、「GB UDP App」という名前をつけました。
新しいプロジェクトを開くとこのような画面になります。
OSC Jack VS のインストールとセットアップ
Scoped Registryという機能で OSC Jack VS をインストールします。
まずは、メニューの「Edit > Project Settings」の中にある「Package Manager」を開きます。「Scoped Registries」という項目があり、ここに情報を入力することで、パッケージを追加することができます。
OSC Jack VS の Githubリポジトリの 「How To Install」の内容をコピーし、New Scoped Registry のそれぞれの項目に記入します。
記入できたら、「Save」をクリックします。
次に、メニューから「Window > Package Manager」 を選択し、Package Manager ウィンドウ(Project Settingsウィンドウではない)を開きます。
左上の「Packages: In Project」をクリックし、「My Registries」を選択します。
すると、Keijiro Takahashiさんのパッケージが表示されます。下の方にスクロールし、「OSCJackVS」を選択し、「Install」をクリックします。
インストールが完了すると、「OSC Jack」と「OSCJackVS」の横にチェックマークがつきます。
私の環境では、下記のようなエラーが出ました。このエラーは、Visual Scripting 1.9.0 との相性問題のようで、Visual Scripting を 1.9.1 にアップグレードすると解消します。
これで、カスタムパッケージをインストールできました。
これをVisual Scripting に認識させる操作を行います。
「Project Settings」ウィンドウで、「Visual Scripting」のタブを選択します。「Initialize Visual Scripting」のボタンが表示されている場合はクリックしてください。その後、「Regenerate Nodes」をクリックします。
これで、OSC Jack のセットアップは完了です。
GB Focus との連携
それでは、GB FocusとUnityを連携させていきます。
まずは、GB Focusをインストールしたスマートフォン(またはタブレット)とPCを同じWiFiに接続させます。そして、WIFIのIPアドレスを調べます。私の場合は「192.168.0.35」です。
次に、OSC Connectionファイルを作成します。「Project」ウィンドウで右クリックし、「Create > ScriptableObjects > OSC Jack > Connection」の順にクリックしていきます。
すると、「OSC Connection」というファイルが生成されます。
生成されたファイルをクリックし、右に表示されている「Inspector」ウィンドウの「Port」に好きなポート番号を設定します。今回は8000のままにしておきます。「Host」の欄はそのままにしておきます。
次に、GB Focus の設定をします。
まずは、GB FocusアプリでUDP計測を選択し、利用するデバイス(今回は FocusCalm™️)を選択します。そして、先ほどのIPアドレスとポート番号を使って、ポートを設定していきます。今回は「Attention」と「Meditation」のポートを作成しました。
次に、Visual Scriptingで受信スクリプトを書いていきます。
まずは、スクリプトを保持する用の Empty Object を作成し、 Scripts という名前に変更します。
次に、Inspectorウィンドウの「Add Component」から、Script Machine を追加します。
Source を Embed にし、Edit Graph ボタンから編集画面に入ります。
警告が出たら、「Change now」 をクリックします。
すると、「Script Graph」ウィンドウが表示されます。
下記の画像のようにウィンドウが小さい場合は、ウィンドウを大きくして「On Start」 や 「On Update」 のノードが見えるようにしてください。
「Script Graph」ウィンドウの黒背景の部分で右クリックをして、OSC Inputと検索します。今回は、floatの値を取得するので、OSC Input (float) を選択します。
Connectionでは OscConnectionを選択します。この状態でノードを複製し、それぞれの Address を /Attention と /Meditation にします
そして、接続チェックを行います。
メニューの「Window」から「OSC Monitor」を選択します。
初めは何も表示されません。
この状態で、GBアプリの「接続」を選択します。そしてUnityのメインウィンドウ上部の再生ボタンを押して、プロジェクトを実行します。すると、OSC Monitor ウィンドウで Attention と Meditation のデータが受信されていることを確認できます。
これで、連携は完了です。
GB Focus から取得した数値でオブジェクトを操作してみる
最後に、OSCを介して取得した計測データを用いてオブジェクトを操作してみます。
まずは、Scene Variable を作成します。今回は、MeditationとAttentionを作成しました。
そして、黒背景を右クリックし、「Set Scene Varible」と検索して、Set Scene Variable ノードを作成します。Set Scene Variable ノードを先ほど作成した OSC Input ノードと接続します。
Attention と Meditation の数値を表示するオブジェクトを作成してみましょう。TextMeshProsを作成します。下記のようなウィンドウがでたら、両方のボタンをクリックしてインポートしてください。(Import TMP Examples & Extras の方はインポートしなくてもいいかもしれません。)
「Canvas」と「Text(TMP)」が生成されるので、Text(TMP)を選択します。「Add Component」をクリックし、Script Machineを追加します。
作成された状態がこちらです。
Script MachineのSourceをEmbedにし、Edit Graphボタンをクリックします。そして、下記の画像ようなスクリプトを作成します。
このスクリプトは次のように動作します。
- Get Variable で Meditation スコア(Float)を取得
- Meditation を四捨五入する
- 数値をString型にする
- Concat で 「Meditation」というテキストと数値のテキストを結合する
- Text Mesh Pro のテキストを設定する
- 上記の処理を毎フレーム(On Update)実行する
Inspectorウィンドウに戻り、Text Input にデフォルトの値(今回は「Meditation: –」)を入力します。
また、オブジェクトの名前を「Text(TMP)」から「Meditation」に変更しておきます(わかりやすくするために)。
Hierarchyウィンドウで、Meditationオブジェクトを複製し、名前をAttentionに変更します。そして、Text Input を 「Attention: –」に変更し、Script Machineも「Meditation」だった部分(Get Variable と Concat)を下記のように「Meditation」に変更します。
そして、Sceneウィンドウで MeditationオブジェクトとAttentionオブジェクトの位置とサイズを調節します。
この状態で再生ボタンを押して、動作確認をします。うまくいくと、数値が表示されます。
最後に、各数値を使って3Dオブジェクトを操作してみましょう。
HierarchyウィンドウでCubeを新規作成します。
CubeのPositionが原点でない場合は、Resetしておきます。
Add ComponentでScript Machineを新規作成します。Source を Embed に変更し、Edit Graphをクリックして、下記のようなスクリプトを作成します。
そして、再生ボタンを押すと、Attentionに合わせてCubeの回転が速くなり、Meditationに合わせてCubeのサイズが大きくなるようになっているはずです。
これで、3Dオブジェクトを操作できるようになりました。
終わりに
本記事では、GB Focus の UDP計測とUnityを連携させる方法を紹介しました。
VFXやサウンドを組み合わせれば、もっと魅力的な脳波アプリを作ることが可能です。(例:https://www.shijimi.dev/development/mindorb)
あなただけの作品を作って、ぜひ本サイトのギャラリーにも投稿してください!