バスキュール技術ブログ

バスキュールが得意とするインタラクティブエンジニアリングを、あますことなくお届け!

UnityでiPadをバーチャルカメラにしてイベント本番で使うときの問題点を解決した話をしますね

バーチャルカメラを振り回していい感じのメタバースの映像を撮る

宇宙とISSを舞台にしたメタバース、THE ISS METAVERSE のテックリード 桟(@katapad) です。

ISSメタバースでは体験者の様子をより魅力的に見せるためのパブリックビューを用意している。iPadをバーチャルカメラにし、手持ちならではのカメラワークで無重力感ある映像を出力している。

このようにiPadがUnityのバーチャルカメラになり、直感的なカメラワークができる。

iPadだけでなくゲームコントローラでも操作できるようにしているが、やはりゲーム感が出てしまう。加速・減速、手ブレ感をチューニングすればそれっぽくもなるが、それはまた別の話。

前提条件: パブリックビューと管理画面をマルチディスプレイで出力

THE ISS METAVERSEではGameViewのDispaly1にゲーム画面(パブリックビュー)、Display2に管理画面を表示して運用している。

この状態でiPadバーチャルカメラを振り回そうとしていた。

iPadバーチャルカメラとフルスクリーンの落とし穴

いざ試してみると以下の障害があった。

  • Live CaptureがUnity Editor 専用。ビルドすると動かせない
    • イベント本番で使うなら、Unity Editorをフルスクリーン化する必要あり
  • Unity Editorをフルスクリーンにすると
    • マルチディスプレイにすると各ディスプレイでマウスの座標・クリック等が共有されてしまう
    • 意図した画面をキャプチャできない
  • Live Captureのないシーンを経由するとLive Captureの接続が切れる

バーチャルカメラとUnity Editorフルスクリーン化+マルチディスプレイを組み合わせると、以下の障害があった。

順番に説明していく。

Live CaptureがUnity Editor専用でビルドすると動かせない (裏技で動かせるらしい)

このiPadをバーチャルカメラにするLive Captureが、実はビルドに対応しておらず、Unity Editorでのみ動作する。

↓Unityの中の人の発言

  1. Yes, the app is only designed to work with the editor. It is theoretically possibly to use for other cases, but this is not officially supported at this time.

  2. Technically you can include the Live Capture package in a standalone build, but it is not officially supported at this time as there is still much work left to properly support this.

↑ この話の流れを見る限り、まだビルドは正式にサポートされてないが、live-captureのパッケージをローカルに移動し、iPadとやりとりをするサーバーをpublicに変更したりCompanionAppServer.OnUpdate()を叩くとうまくいくらしい。って今気づいたよ…。今度試すか…。

じゃあビルドせずにUnity Editorで無理やり使おう!

ということで、まずはUnity Editorでフルスクリーンにできるアセットを導入。

Unity Editorをフルスクリーンにするアセット

Fullscreen Editor | Utilities Tools | Unity Asset Store

このアセットを使うとUnity Editorでもツールバーの出ない完全なフルスクリーンができる。

しかもマルチディスプレイ対応。最高。


display1にUnity内display2の管理画面を持ってきてる

しかし、こういうアクロバティックなことをすると、だいたいうまくいかないもんである。

問題1: Unity Editorでマルチディスプレイをすると、マウス座標が各ディスプレイで共通になって、めちゃくちゃになる

ISSメタバースはパブリックビューと管理画面を1つのアプリで完結させている。なので2画面のマルチディスプレイだ。

困ったことにUnity Editorでの再生時はマウスの位置やクリックなどの情報はすべてのGameViewで共有される。

つまり、GameView1の右上をクリックすると、GameView2の右上もクリックされたことになる。


これは困る…。

解決策: 対症療法で管理画面にロック機能をつけた

ロック解除しても一定時間で必ずロックに戻るようにした。めんどくさい…。

問題2: フルスクリーン時に画面キャプチャーすると、意図しない画面がキャプチャーされる

THE ISS METAVERSEではカメラマンが記念写真を撮ってTwitterにアップする仕組みがある。

twitter.com/astro_cameraman

管理画面とパブリックビュー(ゲーム画面)を同じマシンで出力しており、Display1に管理画面、Display2にパブリックビューが表示される。

で、このキャプチャが難題だった。普通にCameraのTargetTexutreに設定したRenderTextureに焼き込むとポストエフェクトが乗らない。今回はポストエフェクトで太陽に対してレンズフレアを入れてるので、そこを削るわけにはいかない。そこでGameViewをそのままキャプチャする texture.ReadPixels() を使った。似たようなメソッドでScreenCapture.CaptureScreenshotIntoRenderTexture(rt)もあったが、色がおかしくなるのと画像が反転していたので、深く追うのを諦めた。

で、ゲーム画面がキャプチャされるように設定したいところなのだが、フルスクリーンにするとうまくいかない。ゲーム画面ではなく管理画面がキャプチャされてしまうことがある。

ちなみにビルドするとわりと意図した画面がキャプチャできる。Unity EditorではGameViewの座標がマルチディスプレイの環境ではうまく動作しないのが仕様なので、もしかするとDisplay1とDisplay2の座標が同じになって、どっちをキャプチャするかがランダムになるのかもしれない。しらんけど。

解決策: フルスクリーンガチャをする

そんなこんなで何度か試していると、キャプチャ対象になる画面はフルスクリーンにしたときにランダムで決まることがわかった。

なので、フルスクリーンにしてキャプチャし、意図通りの画面をキャプれたらOK。失敗したらもう一度フルスクリーンにしてキャプチャ…、というガチャをすることで対応した…。

問題3: PhotonでシーンをロードするとLive Captureが外れる

ISSメタバースはロビーとなるシーンを経て、実際のゲームルームシーンへ遷移する。

Live Captureが含まれているのはロビー以降に読み込まれるゲームシーンのみ。なので、ロビーを経由した時点でiPadの接続が切れてしまう。

解決策: iOSのタスク切り替えを一瞬やると戻る

Live CaptureのiOSアプリがタスク切り替え時に再コネクトしようとするらしく、それでうまくいく。

まとめ

そんな感じで無理やり対応したけど、めちゃくちゃいいカメラワークができたんじゃないか。

あと、地味にビルドせずにフルスクリーン化して動かすのもめっちゃ楽。ずっといじくり倒せるのがいい。

でもビルドしてえよなあ。またいつかビルドできるように書き換えよう。

キャプチャまわりはこうしたほうがいい!とかLive Captureビルドして使った!などの怪談がありましたら、教えてください!待ってまーす!

おもしろがって作れる人材募集中!

ISSメタバースみたいな新しい遊び場を作って、自分らで遊び倒して、でっかいプロジェクトにしてみんなに遊び倒してもらう。 そんなことやってみたいなーって思う人はJOIN US!!!

bascule.co.jp