GB Focus「UDP計測」と Unity で脳波を活用したゲームを作る方法

はじめに

皆さんは、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ボタンをクリックします。そして、下記の画像ようなスクリプトを作成します。

このスクリプトは次のように動作します。

  1. Get Variable で Meditation スコア(Float)を取得
  2. Meditation を四捨五入する
  3. 数値をString型にする
  4. Concat で 「Meditation」というテキストと数値のテキストを結合する
  5. Text Mesh Pro のテキストを設定する
  6. 上記の処理を毎フレーム(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

あなただけの作品を作って、ぜひ本サイトのギャラリーにも投稿してください!