Unity · VRソフト

リアルなコミック本を作る。バーチャルで。

Channel Playerでは、コミックブック形式(zipかcbzファイル)の静止画を表示する機能を付けたが、そもそもVR空間でやってみたいことは、コミック本を入手したら、戸棚に並べて見たりとか、ひとつひとつ手に取って読んでみるとかだろうと思う。

そこで、Unity Asset Storeで探して見ると、ゲームの中で使えるリアルな3D形状の本を作るアセットが有ったので入手してみた。MegaBookと言う名前のものである。これのサンプルシーンをUnityでQuest2向けにbuildして実行したときのキャプチャが以下である。

全くコードを書いていないので、ページをめくったりも何もできないが、Questを被れば、確かに目の前の机の上に本がある。どういう本に見えるかは、Unityアセット Magabookのページに動画があるので、ご覧頂くと良いと思う。これに対して、実行環境でコミックブックの全ページを読み込ませたり、表紙を差し替えたりすれば、コミックブックビューアーになるはずである。

現在、アセット作成元に表紙や帯を具体化する予定があるか伺っているけど、まだ返事は付いていない。無いなら自分で書くことになると思うが、いずれにせよ、現実世界のコミック本に近いものをVR空間に持ち込むことが目標である。従って、カバーや帯がついていて、外して見たり、カバーに隠された別の表紙を見たり出来たり、しおりを挟んだりできるようにしたいが、そこまで行かなくても、手で持ってページをめくれるようにしたいと思う。

ちなみに、Oculus Quest 2ではなく、Oculus Goにもapkをインストールしてみたら動いたので、Androidのレベルが低いままで動くのならば両方で動くものを目指したいと思う。だけど手でつかんだりが出来そうになければ断念するかもしれない。

広告
#ChannelPlayer · FOVE · Quest2 · Rift · VRソフト

Channel Player Ver1.19リリース

VR動画再生アプリであるChannel Playerの新しい版をリリースしました。今回は新たにコミックブック(zip, cbzファイル形式)に対応し、静止画の表示が可能です。Channel Playerは、宇宙空間にて宇宙船の中のシアタールームでの動画視聴という体裁をとっているため、シアターでの上映時には真っ暗となる代わりに、宇宙空間に飛び出した状態で閲覧することとなります。ただし180°や360°の動画の場合には真っ暗な状態となります。詳しくはソフトウェアのページにてご案内しています。

#ChannelPlayer · Quest2 · Unity · VRソフト

Quest2でのApplication.Quit()呼び出し

以下の記載は古くなっていて、現在はApplication.Quit()が使えます。後述します。2022-09-07

Unityのアプリケーションではプログラム終了の際、Application.Quit()を呼び出すのだが、これがOculus Quest(Quest 2も)ではプログラムは終了するが、次回の起動に失敗するという問題がある。結論はApplication.Quit()の代わりに、以下を呼び出せばよい。

System.Diagnostics.Process.GetCurrentProcess().Kill();

Channel Playerでは、2回に1回は起動できないという不具合があり、メモリーリークなどを疑い、場所を特定するために、機能をどんどんはずしていて、ついにシーン1個で、Start()でただApplication.Quit()するだけでも事象が発生することが判明した。そこで削るのではなく新たにプロジェクトを作り、デフォルトのシーンでは事象が発生しないことが判明。ただしこのプロジェクトではソースコードが無いので自力ではアプリケーション終了できず、システムメニューから終了させていた。そこでスクリプトを1個置いて、Application.Quit()を記述すると事象が発生し、ここに問題があることが特定できた。

それまでは、debug logの以下のようなログから、Consumer closed input channel or an error occurred. events=0x9 でネットを検索しても原因は特定できずに困っていたが

11-03 09:55:29.617: W/InputDispatcher(1058): channel '8c14a4d com.Applet_LLC.Channel_Player/com.unity3d.player.UnityPlayerActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
 11-03 09:55:29.617: E/InputDispatcher(1058): channel '8c14a4d com.Applet_LLC.Channel_Player/com.unity3d.player.UnityPlayerActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
 11-03 09:55:29.618: I/WindowManager(1058): WIN DEATH: Window{8c14a4d u0 com.Applet_LLC.Channel_Player/com.unity3d.player.UnityPlayerActivity}
 11-03 09:55:29.618: W/InputDispatcher(1058): Attempted to unregister already unregistered input channel '8c14a4d com.Applet_LLC.Channel_Player/com.unity3d.player.UnityPlayerActivity (server)'

Application.Quit Oculusでネット検索すると、すぐに以下の記述がヒットした。AndroidのApplication.Quit()ではきちんと終了できていないそうだ。

Application.Quit() causes crashing on next app launch — Oculus https://forums.oculusvr.com/developer/discussion/81042/application-quit-causes-crashing-on-next-app-launch

以下追記(2022-09-07)。

Unityで作ったAndroidアプリがBackキー押下で終了できない場合の仮対応 – Qiita https://qiita.com/ganessa/items/3d80b9065546788c30d4
によると System.Diagnostics.Process.GetCurrentProcess().Kill();でも良いが、以下で安定するとのこと。

        Application.runInBackground = false;
        Application.Quit();
        return;

綺麗に終了するようになったが、2回目起動しない問題再発。
Application.Quit(); したあとで、System.Diagnostics.Process.GetCurrentProcess().Kill();を呼ぶようにしてみるが、これではだめだった。マルチスレッドで動いていて、親プロセスだけ終了させてもダメらしい。

https://issuetracker.unity3d.com/issues/android-application-dot-quit-and-application-dot-unload-crashes-the-app-on-android-9-dot-x-devices-when-scripting-backend-is-set-to-il2cpp

上記によれば、2018.3.8f1では良いらしい。2018.4.6でも直したようなので、これにしてみたら
Unity2018.4.6f1では、Application.Quit&()で正常終了することを確認した。
結論は、本コラム記載当初とは逆となり、System.Diagnostics.Process.GetCurrentProcess().Kill();は、Arm64向けでは失敗する。

#ChannelPlayer · Quest2 · Unity · VRソフト

zipファイルを開く(続き2)

WebDAVファイルサーバー上に、zipファイルではなく、拡張子を変えたcbz(コミックブック形式でzipで固めたものの意味)を置いてみて、Channel Playerの試作版をQuest2で動かしてアクセスしてみると、サンプルでは動いているのに、なぜかうまく開けない。

さんざん悩んで結論は、拡張子がcbzだとWebサーバーはファイルの存在は教えてくれても、ファイルへのアクセスをさせてくれないというものであった。拡張子をzipにすると問題無くアクセスできる。

WebDAV対応の際は、zipファイルのみコミックブックとして参照可能とするしかないかなと思う。WebDAVの設定に、cbzの設定を入れれば良いのだろうけれども、WebDAVの設定は難しいので、それをユーザーに強いるぐらいなら、拡張子zipのみとした方が潔い感じ。

ちなみにコンテンツ選択画面で、zipファイルを選ぶと、そのzipファイルを開いて、表紙(zipファイル内の最初の静止画ファイル)を表示させるのは、遅延するだろうから調整必要とも考えていたけど、意外と速い。本を開いてページ一枚一枚取り出すやり方で特に問題無さそう。