p_chinのおっぱいブログ

UnityとPerlなど

nginxでAssetBundleを配信する時にハマった

nginxでAssetBundleを配信

AssetBundle(.unity3dファイル)はバイナリで、ブラウザで読めないので表示やダウンロードは出来ないようだ

正しく配信されてるかどうかはcurlコマンド使ってターミナル等から確認するのが良い

unity3dフォーマットファイルのContent-typeがnginxのmime.typesファイルに記述されてなかったので、octed-streamになってしまってる。

 

正しいunity3dフォーマット用のContent-Typeを以下の様にmime.typesファイルに追加する

types {
  application/vnd.unity    unity3d;
}

ちなみにnginxはContent-Typeをjpg配信ならimage/jpegにして、htmlならtext/htmlによしなに設定してくれる(/etc/nginx/mime.typesファイルとかに登録されているから)

参考:(http://answers.unity3d.com/questions/28968/mime-settings-for-unity3d-file-type.html)

 

一応Content-Dispositionも設定しよう

ファイルをブラウザに表示するのでは無く、downoadするようにする設定をヘッダに付ける

add_headerモジュールを使えば設定できる

    server {
         server_name hoge.com;
         listen 80;
         location ~ ^/download/(.*\.unity3d)$ {
            alias /home/app/AssetBundle/$1;
            add_header Content-Disposition 'attachment; filename="$1"';
         }
     }

以上で設定完了

 

nginx.confのContent-Typeの設定してる所

ちなみにnginx.confは以下の様にContent-Typeを振り分けている(デフォルトかな?)

以下の場合はmime.typesに書かれていないファイルフォーマットは自動的にoctet-streamになってる

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
}

 

まとめ

もしかしたら以上の様な設定しなくても、UnityからurlにアクセスすればAssetBundle取って来れるかもしれないけど、.unity3d様のContent-Typeも用意されてるので、ちゃんと設定した方が行儀がいいと思った。
  • バイナリデータなのでブラウザでは分からないのでcurlを使う(-Iオプションでヘッダーのみを見れる)
  • Content-Typeがocted-streamになってる(バイナリや良く分からない型,ブラウザだと読めないデータ)
  • nginxやapacheはContent-Typeをjpg配信ならimage/jpegにして、htmlならtext/htmlによしなに設定してくれる(/etc/nginx/mime.typesファイルに登録されているから)
  • Content-Typeをapplication:/vnd.unity3dにする必要が有る(http://answers.unity3d.com/questions/28968/mime-settings-for-unity3d-file-type.html)
  • なので、mime/typesファイルにunity3dのContent-Typeはapplication:/vnd.unity3dだと登録する(ここに登録されてなければocted-streamになるのでもう大丈夫)