夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Osaka HoloLens Hackathon Online 2021 チームビルド 4日目 デバイス情報の表示

本日はイベント枠です。   昨日3月6日から大阪駆動開発のイベント「Osaka Hakkathon Online 2021 チームビルド」が始まりました。

このイベントは関西のxRコミュニティ大阪駆動開発が主催のHoloLensイベントで、毎年行われているイベントが今年は新型コロナウィルス感染症の影響を受けオンラインの形で行われました。

redhologerbera.hatenablog.com

〇ボッチソン『HoloLensで片手で操作できる未来感あるUI』

今回筆者が取り組むテーマは『HoloLensで片手で操作できる未来感あるUI』です。

これはHoloLens 2で使用できるHandTrackingを用いたオリジナルのUIを作成するプロダクトで、MRTKで提供されているHandMenuなどデフォルトのHandUIは片手操作ができないという門外があります。

様々な人が今後HoloLensを使っていく中で片手で操作できるUIというものを作りたいと思いテーマとして選びました。

f:id:Holomoto-Sumire:20210306185244j:plain
画像はイメージです

審査員の方からはプロダクトが多い中このようなコンポーネントは非常に価値がある。ぜひUnityパッケージにして公開してほしいという言葉をいただいています

〇デバイス情報の表示

昨日までで指検知の機能を作成しました。今回は少しデザイン面を考え、デバイス情報をHandMenuに表示させることにしました。

HoloLensでは[DeviceInfo]を使用することで使用しているデバイスの言語、バッテリー、GPUから時間などの情報を取得することができます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

今回はこれらの中で非常によく使用するバッテリー残量をさせます。

①シーンに[Quad]を配置し[SolberHandler],[HandBounds]、[HandConstraint]コンポーネントをアタッチします。

f:id:Holomoto-Sumire:20210309205415j:plain

マテリアルのテクスチャには今回MRTKに同梱されているアイコンの画像を使用しました。

②バッテリー残量を表示するためのスクリプトを作成します。今回は次のようなコードを書きました。

using Microsoft.MixedReality.Toolkit.Utilities;
using UnityEngine;
using TMPro;

[RequireComponent(typeof(GridObjectCollection))]
public class DeviceStatusChecker : MonoBehaviour
{
    private GridObjectCollection goc;
    [SerializeField,Header("Battery")] [CanBeNull] TextMeshPro batteryText;
    public int battery;
    
    [SerializeField]
    private GameObject[] batteryLevelObjects;
    
    void Start()
    {
      BatteryStatusCheck();   
    }
    public void BatteryStatusCheck()
    {
        float batt = SystemInfo.batteryLevel * 100f;
        //debugText
      //  batteryText.text = batt.ToString();
      Debug.Log(batt);
        if (batt>90)
        {
            battery = 5;
            batteryLevelObjects[0].SetActive(true); batteryLevelObjects[1].SetActive(true); batteryLevelObjects[2].SetActive(true); batteryLevelObjects[3].SetActive(true); batteryLevelObjects[4].SetActive(true);
        }
        if (90>batt||batt>80)
        {
            battery = 4;
            batteryLevelObjects[0].SetActive(true); batteryLevelObjects[1].SetActive(true); batteryLevelObjects[2].SetActive(true); batteryLevelObjects[3].SetActive(true);
        }
        if (80>batt||batt>50)
        {
            battery = 3;
            batteryLevelObjects[0].SetActive(true); batteryLevelObjects[1].SetActive(true); batteryLevelObjects[2].SetActive(true);
        }
        if (50>batt||batt>20)
        {
            battery = 2;
            batteryLevelObjects[0].SetActive(true);batteryLevelObjects[1].SetActive(true);
        }
        if (20>batt||batt > 0)
        {
            battery = 1;
            batteryLevelObjects[0].SetActive(true);
          //  Material mat = batteryLevelObjects[0].GetComponent<Material>();
           // mat.color = Color.red;
        }
    }
}

これはバッテリー残量を取得して、その値に応じて5段階に分け対応する数batteryLevelObjectsを表示させるスクリプトです。

[SystemInfo.batteryLevel]によってバッテリー残量を取得できますが、その値は0~1で返されます。 ここでは100をかけてパーセント表示にして扱いやすい形に変えています。

③Quadの子オブジェクトとしてQuadを5つ配置し、[DeviceStatusChecker]コンポーネントの[batteryLevelObjects]にアタッチします。

f:id:Holomoto-Sumire:20210309215026j:plain

以上でデプロイして実機で確認します。

下画像の場合HoloLensのバッテリー残量が32%のため正常に表示されていることが確認できます。

f:id:Holomoto-Sumire:20210309214544j:plain

バッテリーレベルと表記していませんがデザインの一部にデバイス情報を用いるというものは以前から取り入れてみたいと思っていた概念なので今後昇華させていきたいです。