MagicScript製Landscapeアプリ内で生成したプリズムの判定方法
この記事は、Magic Leap Advent Calendar 2020 の14日目です。
プリズムについて
プリズムは3DモデルやUIといった表示オブジェクトを管理するためのボックス型のオブジェクトです。
これはLumin OS上で動作する、Landscapeアプリの特性のひとつで、Landscapeアプリ内で必ず1つ以上あります。
プリズムにはサイズがあり、サイズ内に収まらない3DモデルやUIは表示が欠けた状態や全く見えない状態になります。
プリズムのサイズは変更可能。あまり大きなサイズにすると、他のLandscapeアプリケーションの置き場がなくなるため、適度なサイズにする必要があります。
プリズムは、Magic Leap 1のControlで移動、回転、サイズ変更を行うことができ、プリズムの状態は、Magic Leap 1再起動後も復元されます。
プリズムの生成について
Landscapeアプリ内では、プリズムを生成する方法は以下になります。
LandscapeAppを継承したクラス内で、this.requestNewPrismを実行するとプリズムは生成されます。このプリズムに対して3DモデルやUIを追加していきます。
再起動後の挙動について
Landscapeアプリが起動している状態で、Magic Leap 1を起動するとLandscapeアプリも同時に起動されます。その際、LandscapeAppのonAppStart()が呼び出されます。
もし、複数のプリズムが起動していた状態で、Magic Leap 1を再起動するとLandscapeAppのonAppStart()が生成したプリズムの個数分、呼び出されます。
プリズムの中身が変わる事象
Landscapeアプリ内で生成したプリズムは、Magic Leap 1再起動後に生成元のLandscapeAppのonAppStart()が呼び出されるため、意図した動きにならない場合があります。
以下のようなケースの場合、BEFOREではLandscape Appが生成したPrism Bと Prism C 後にMagic Leap 1を再起動します。すると、Prism BとPrism Cの中身が変わってしまい、Landscape Appと同じ状態となります。
これは、LandscapeAppのonAppStart()全てのプリズムに対して発行されるため、onAppStart内の処理が全てのプリズムで実行されたことにより、このような状態に陥ります。
プリズムの判定方法
Magic Leap 1再起動後もLandscapeアプリ内で生成したプリズムの判別を行う方法として、プリズムに対して判定情報を持たせるやり方があります。
プリズムには情報を保存するsavePropertyWithPcfというメソッドが用意されています。以下のようにキー名と値を設定します。
LandscapeAppのonAppStart()の呼び出し時にreadBoolPropertyFromPcfを呼び出して、判定を実施。判定条件に応じて処理を実施することが考えられます。
このようにプリズムに独自にプロパティ情報を持たせて、LandscapeAppのonAppStart()内で判別することが可能です。
参考情報
https://forum.magicleap.com/hc/en-us/community/posts/360062337472-multiple-Prisms
Magic Leap Meetup vol.2
2020年12月17日(木)19時~22時にオンラインで開催されたMeetupの動画がYouTubeにアップしています。まだ、ご覧になられていない方は、是非、見て頂きたいです!
Magic Leap Meetup vol.2 in Japanのアンケートを受け付けています。感想や要望などございましたら、ご回答いただけますと大変嬉しいです。
ARの企画・開発に関するご相談など
私が勤めている会社ではARの企画や開発を行っています。何かございましたら以下のお問い合わせフォームにてご相談いただければと思います。