StreamingMeshはWebRTCを経由して,リアルタイムに3Dモデルを読み込んで表示する 実験的なアセットです. 現バージョンでは受信側(MeshReceiver)はビルドしたアプリケーションに対応しますが,送信側(MeshSender)はUnityEditor上でしか動作しません.これはマテリアルのプロパティやテクスチャのアクセスがUnityEditorのコードを利用しているためです.また,現行バージョンではSkinnedMeshRendererに設定されたMeshのみ対応します.一部の計算にComputeShaderを使用しているため,UnityのComputeShaderに対応している環境が必要です.(Macではうまく動作しません)
アセットストアのWebRTC NetworkをUnityにインポートします.これが最低限ないとコンパイルエラーで動作しません.
7Zip, lzma, LZ4, fastLZ, zip/gzip & brotli multiplatform plugins.によるデータ圧縮をサポートしているので,このアセットとStreamingMeshのアセットをインポート後,Assetフォルダ直下のsmcs.rspとgmcs.rspを削除することでデータ圧縮の恩恵を受けることができます. 上記のアセットをインポートせずにsmcs.rspとgmcs.rspを削除すると,コンパイルエラーが起きてStreamingMeshが利用できなくなるので注意です.
- 送信側,受信側ともに Edit -> Project Settings -> Player から Rssolution and Presentation タブ内の Run In Background を有効にしておくことを推奨します.
-
任意のGameObjectにMeshSenderのスクリプトを追加します.このとき,自動的にWebRTCManagerとSkinnedMeshesValidatorが追加されます.
-
送信したいMeshを含むGameObjectをMeshSenderのTarget Game Objectに追加します.GameObjectから対象のMeshを再帰的に探索するので,Hierarchy直下のGameObjectを追加すると良いでしょう.
-
WebRTCManagerのChannelに任意のチャンネル名を指定します.指定しない場合,ランダムのチャンネルが設定されます.
-
Area Rangeに対象のモデルの大きさ(Unity上のスケールサイズ)よりも大きい数字にします.サイズをあまり大きくすると精度が粗くなるため,なるべくこの数字は小さくする必要がありますが,この範囲外をオーバーして描画されると欠落やエラーが発生するので注意が必要です.
-
Reimport Textures In Gameのチェックを外し,Enable Textures Writable Flagボタンを押しておくと,実行時に速やかに処理が行われるようになります.テクスチャ情報を送信する際は,テクスチャが書き込み可能でないとアクセスができないため,Reimport Textures In Gameのプロパティをオンにして実行時に変更するか,事前にEnable Textures Writable Flagボタンを押して,テクスチャを書き込み可能にしておく必要があります.
-
Auto Reconnectはサーバーへの接続に失敗した際に,自動的に再接続を行います.
-
Package SizeはMeshの有効範囲を指定の数された数で領域を分割します.ここの数字が128の場合,128*128*128の最大2,097,152パッケージを持つことになります.精度を高めるために使いやすいですが,通信サイズが大きくなりやすくなります.Area Rangeの精度と比較しながら変更します.
-
FrameIntervalは送信する秒間フレーム数です.0.1から変更することはあまりありません.
-
Subframes Per Keyframeはキーフレームの間に差分フレームをいくつ挿入するか指定できます.FrameIntervalが0.1の時,秒間にキーフレーム2,差分フレーム8を送る計算になります.0のときはキーフレームのみの送信になります.
-
任意のGameObjectにMeshReceiverのスクリプトを追加します.このとき,自動的にWebRTCManagerとSkinnedMeshesValidatorが追加されます.
-
WebRTCManagerのChannelに任意のチャンネル名を指定します.MeshSenderと同じチャンネル名を指定しておく必要があります.指定しない場合,ランダムのチャンネルが設定されます.
-
もしSkinnedMeshesValidatorのDefault Shaderの箇所がNoneになっている場合は,何らかのシェーダーを当てはめる必要があります.Shadersフォルダ内のStandardがデフォルトで用意されています.
-
SkinnedMeshesValidatorのShadersは特定の名前のマテリアルに指定したシェーダを当てはめることができます.Sizeを0から必要な数に変更し,Material Nameに対象のマテリアル名,Shaderに当てはめたいShaderを指定してください.
-
Interpolate Verticesはフレーム間の線形補完を有効にします.この効果は非常に強力です.
-
Auto Reconnectはサーバーへの接続に失敗した際に,自動的に再接続を行います.
- Time Spanはフレーム間の線形補完のタイミングを指定します.デフォルトではフレームは0.1秒毎に来るため,0.01秒ごとに線形補完を行う設定になっています.現行バージョンでは変える必要は特にありません.
一部のソースコード(Crc32.cs, SerializableDictionary.cs)は著作権者が異なりますので注意してください.自分が書いたものはすべてMIT Licenseにしています.