StreamingMesh使い方雑書き(2018/9/12時点)

はじめに

この記事はUnity用アセット、StreamingMeshの使い方について、雑書きしていくノートになります。読み物というより説明書的なノリで、何かあったら随時更新していきます。

事前に必要なもの

1.Node.js をインストールして、PowerShellで実行できるようにしておいてください。8.12.0LTSがおすすめです。

2.Unity 2017.3.1f1以降をDLしてください。(ただし、2018以降はテストできてないです)

3.ffmpeg が必要なのですが、Program Filesにインストールするのではなく、ffmpeg.exeのバイナリファイルが必要になります(音のエンコードに使います)、Macをお使いの方は下で指定する箇所にシンボリックリンク張るだけでも良いです

4.有料のUnity Assetが必要です。(Gzipをマルチプラットフォームで動かすためです)以下のアセットのいずれかを購入してください
おすすめは上のほうです。

StreamingMesh本体の置き場所

プロジェクト本体が置かれたGitHubリポジトリ
(プライベートだったせいか、Page not Foundってサムネイルになっていますが、リンク先あります)

サーバーサンプルの置き場所

Unityで処理できない、サーバーサイドの処理です。Node.jsで作成。

動かし方(サーバー編)

1.本体とサーバーサンプルをGitHubからCloneしてください。(Cloneの仕方は複数あるので問いません)
直接DLする場合は以下のように、Clone or download をクリックした後Download ZIP で DLしてください。

2.サーバーサンプルのstm_server_example.zipを展開、PowerShellを起動して、stm_server_exampleのフォルダがある場所まで移動してください。

3.以下のコマンドを打ち込んで、依存パッケージをインストールしてください。

npm install

もし

npm: 用語 'npm' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。

とか表示された場合は、Node.jsが正しくインストールされていないようなので、Qiita記事とかでインストールの方法を確認してください。
うまくいった場合、

とかの画面がでてくるはずです。

4.ffmpeg.exestm_server_exampleのフォルダ内のbinフォルダ内に追加してください。

5.以下のコマンドを打ち込んで、サーバーを起動します

npm run start

初回実行時、下のような画面が出るかもしれません。そのままアクセスを許可(A)を押してください。セキュリティが気になるようでしたら、プライベートネットワークにチェックを入れるだけでも良いと思います。(動作確認未検証)

以下のように、listning in: 127.0.0.1:8000 と出ていれば大丈夫です。(スペル間違いあるけど気にしない)

サーバーを終了させるときはCTRL+Cを2回連続で押すと、

バッチ ジョブを終了しますか (Y/N)? 

と出るので、Yを入力してエンターキーを押すことで、サーバーを終了させることができます。

動かし方(Unity編)

1.StreamingMesh.zipを展開し、展開されたフォルダをUnityで開いてください。下のエラーはGzipライブラリがインストールされてないせいです。

2.Gzipのアセットをインストールします。ストアからダウンロードします。

このままだとすべてのファイルがインポートされるため、いったんすべてのファイルをNoneを押してチェックをすべて外し、zip.unitypackageだけをインポートします。

そして、インポートしたzip.unitypackageをさらに開いて、インポートします。今度はすべてインポートします。

Sender(データを送る側)を作成する

1.適当なGameObjectを作って、StreamingMeshフォルダ直下にあるSTMHttpSenderをGameObjectにアタッチしてください。

2.Target Game Objectsに送信したいモデルデータをセットしてください

事前に、モデルデータのメッシュはすべてSkinned Mesh Rendererになっていることを確認してください。現バージョンのStreamingMeshはそれ以外のMeshが含まれていると、エラーが起きてしまいます。普通のMesh RendererからSkinned Mesh Renderer に変更する方法があるので、調べてみてください(ここに書くとさらに文章量増えるので・・・)

また、モデルにテクスチャータイプが、Default以外になっているものが含まれていると、同様にエラーが起きるため、注意が必要です。(特にSpriteなどが含まれていると、原因不明のエラーに悩まされます。TextureShapeも2Dである必要があります。

SDじゃないUnityちゃんのモデルはMesh Rendererが入っていたり、TextureもDefault以外が含まれてたり、TextureShapeにCubeが含まれていたりと、エラーになる要因が多いので注意です)

3.STM Http Serializer(自動的にアタッチされます)のAddressがサーバーを動かしているアドレスと一致しているか確認してください。(ローカルでサーバーを動かしている場合は、http://127.0.0.1:8000/channels/で大丈夫です。)

4.Channelの項目にわかりやすい名前を付けてください。サーバー側に保存されるデータのフォルダ名になります。(channel_TESTなどで良いです)

5.Use Local Files のチェックを外しておいてください(デバッグ用に残っています)

5.次の処理の前に、一度Unityを実行してください。STMHttpSerializerがExecuteInEditModeで作られているため、GameObjectにアタッチした後だと、スクリプトの実行順が原因で、次の処理が正常に動作しません。

6.Create Channelを押してください。ここで初期データ(テクスチャ、モデルのインデックスデータ、コンフィグデータなど)がサーバーに送られます。この時、サーバーが起動しているか確認しておいてください。

うまくいけば、サーバー側で以下のようにログが表示されます。

7.Unityを実行して、Start Recordingを押してください。実行してから押さないと何も起きません。

うまくいくと、サーバー側のログにffmpegのエンコードログが流れてくると思います。

サーバーのpublicフォルダ内にデータが来ています。

これでSender側からデータを送れるようになります。

Sender側の運用の注意として、一度Unityの実行を止めると、記録の連番が再度0からになるため、最初から記録のやり直しになります。
また、サーバーを終了させると、Sender側のアップロード用トークン情報が失われるため、同じチャンネルにアップロードできなくなります。その場合、一度Channelに指定した名前のフォルダを削除する必要があります。


Receiver(データを受け取る側)を作成する

1.適当なGameObjectにSTMHttpMeshReceiverをアタッチします。

2.AddressとChannelに上のSenderで設定した値を入れます。(ローカルでサーバーを動かしている場合は、http://127.0.0.1:8000/channels/で大丈夫です。)

3.Use Local Filesのチェックは外してください。(デバッグ用に残っています。)

4.そのままUnityを実行します。(サーバーが起動しているか確認してください。)

画面にモデルが表示されてたら大丈夫です。

とりあえず本日の更新はここまで(2018/9/12時点)

この記事が気に入ったらサポートをしてみませんか?