Bakulog

獏の夢日記的な何か。

QUMARIONのUnity用ライブラリでQUMARIONのボタン状態を参照する方法

小ネタというか、前回の記事に載せ忘れた補足です。

 

UnityでQUMARIONを導入する方法については「QUMARIONをUnityで使うライブラリを公開しました」をご覧ください。本記事はその記事の補足です。

 

上記の記事ではQUMARION SDKとかラッパーのDLLを持ってきてUnityのAssetsに配置する手順と、QUMARIONヒューマノイドの姿勢を同期する方法を紹介しました。もちろんヒューマノイドQUMARIONの同期はライブラリとしての最重要な部分なのですが、サンプルとしてうっかり紹介を忘れてたのがQUMARIONの背面についているボタンの扱いです。

qumarion_button

実機を持っている人なら分かると思いますが、QUMARIONを集中してグリグリ動かす場合はどうしても両手でつかむ必要があるため、QUMARIONとマウス/キーボードを同時に使うようなUXは明らかにアウトです。

そうすると多くのゲームで必要なメニューやポーズの機能をどう提供するかが問題になるのですが、QUMARIONの場合はこの背中のボタンでどうにかしてもらうのが有効な解決策となります。そもそもQUMARION用のゲーム作りたい人が世間に何人いるか分かりませんが。

 

で、もちろんQUMARIONのボタン状態チェック機能はラッパーの一環として実装してあります。スクリプトはこんな感じ。

using UnityEngine;
//ポイント1: Baku.Quma.Low名前空間にもQumarionクラスがあるけど使わないように!
using Baku.Quma.Pdk;

public class QumarionButtonChecker : MonoBehaviour
{
    private Qumarion _qumarion;

    void Start ()
    {
        //PCに接続中のQUMARIONがあるかどうかチェックし、存在する場合は接続
        if(PdkManager.ConnectedDeviceCount > 0)
        {
            _qumarion = PdkManager.GetDefaultQumarion();
        }
        else
        {
            Debug.LogWarning("Qumarion was not found");
        }
    }
    
    void Update ()
    {
        if(_qumarion == null)
        {
            return;
        }

        //ButtonStateプロパティをチェックすると現在の状態が取得可能
        //レスポンスがそこまで速くないのでゆっくり押すような用途で使うこと!
        bool isButtonDown = (_qumarion.ButtonState == QumaButtonState.Down);
        Debug.Log(string.Format("ButtonState is Down ? : {0}", isButtonDown));
    }
}

これをカメラでも何でもいいのでオブジェクトにアタッチして実行すると、ログにボタンが押されてるかどうかに応じた出力がバーッと表示されます。

 

残念ながらラップ元のAPIは「ボタンの状態が変化した場合のコールバックを登録」的な処理に対応していない為、ラッパーの方でも上のように「現在のボタンの状態を取得」という機能だけを提供しています。ボタンの状態変化をイベントとして検出したい場合は「ボタン監視するシングルトンオブジェクトが状態変化を検出したらeventを発火」みたいなパターンでうまく対応してください。