UnityのWebGL出力について
自社サービスのフロント部分をUnityで開発していた、ある日のこと。
(今年の3月あたりの話になります)
「ブラウザで動したらいいのでは?」という話が出てきました。
その時に調べた内容をメモとして残しておきたいと思います。
Unityで開発したものを、ブラウザで動作させる場合2つ方法があります。
・UnityWebPlayer
こちらは、プラグインをブラウザにインストールして動かすタイプです。
所謂Flashみたいなものですね。
言語はJavascriptで、ブラウザからGPUを操作し、Canvasに描画します。
今回はWebGLについてです。
実は、Unity5.3.3からWebGL出力ができるようになりました。
ただし、WebGL出力の機能はプレビュー版となっていて正式リリースではありません。
また、Unityの公式ページではモバイル端末は未サポートとなっています。
以下、Unity公式ページから抜粋になります。
http://docs.unity3d.com/ja/current/Manual/webgl-browsercompatibility.html
Unity WebGL コンテンツは現在モバイル端末ではサポートされていないことに注意してください。一部端末、特にハイエンドなものでは動くかもしれませんが、大抵の端末は性能不足で Unity WebGL を十分に動かすだけのメモリがありません。
早速、自社サービスで作成していたパズルゲームをWebGL出力して、PC版Chromeで確認したところ、ほぼ完璧な動きをしていました。
問題は、Arialフォントの文字列が描画されないことくらいでした。
(Arial=動作環境のデフォルトフォント)
この問題は、Fontデータも一緒にビルドして組み込んだFontを使用することで解決します。
また、サーバー上に配置したアセットバンドルを読み込むことができます。
実は、自社サービスはスマートフォンがターゲットとなっています。
なので、PCで動いただけでは喜んでいられません。。。
さっそく、本命のAndroid版のChrome(Nexus5)で動作確認してみました。
・・・結果は、残念なことになりました。
動くこともあれば、動いたとしてもエラーも吐かずに固まってしまったり、
何も表示されないまま固まってしまうなど不安定な動きとなっていました。
Nexus5くらいの性能ならば動くと信じたかったのですが、残念です。
まとめとして、UnityのWebGLはPCブラウザで動作させるには問題がないことが解りました。PCのブラウザ向けにリッチなコンテンツを開発するのにむいているのではないでしょうか?
また、ざっくりとした説明になりますが、UnityのWebGL出力はemscriptenを使用しています。
emscriptenとは、c,c++からLLVM生成して、それをJavaScriptに変換するコンパイラになります。つまり、コンテンツをc,c++で開発をしておけば、PCアプリ、スマートフォンアプリ、Webアプリでも同じコードで済みます。
今後、emscriptenがWebアプリの開発にどう影響を与えていくか気になります。
最後に、UnrealEngine4でもWebGL出力が可能になっていましたので調べてみましが、結果はUnityと同様結果でスマートフォン環境では厳しいという結果になりました。
著者:ai
Data too long for column
mysqlにおいて、今まで問題無かった個所で突然「Data too long for column 'xxx'」エラーが発生するようになったら確認しておくこと。
sql_modeに「STRICT_TRANS_TABLES」を付けていると桁数があふれた時にエラーを返すようになる。今まで付けていなかったのに何らかの理由で付けた場合、今まで問題無かった個所でエラーが発生する事になる。
- sql_modeの確認
mysql> SELECT @@GLOBAL.sql_mode; +--------------------------------------------+ | @@GLOBAL.sql_mode | +--------------------------------------------+ | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+
- オンライン状態での変更
mysql> SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
- my.cnfでの設定
[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION
著者:t.n
bashrcを晒してみます。
余りにも更新していないので、私の .bashrcでも晒しておきますね。 特におもしろいことはしていませんが・・・
# User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias db='ssh dbxxxx' # colors eval "`dircolors -b`" alias ls='ls --color=auto' alias sl='ls --color=auto' alias dir='dir --color=auto' alias vdir='vdir --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto'
ついでに、 .vimrc です。
syntax on set fileformats=unix,dos,mac set backspace=indent,eol,start set history=100 set ruler highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray match ZenkakuSpace / / set encoding=utf-8 set termencoding=utf-8 set fileencoding=utf-8 set fileencodings=ucs-bom,euc-jp,cp932,iso-2022-jp set fileencodings+=,ucs-2le,ucs-2,utf-8 set tabstop=4 set autoindent set expandtab set shiftwidth=4
さとう
UnityのAsset参照に関して
Unityで各プラットフォーム用にビルドすると関連するAssetが取り込まれます。
しかし、想定外のAssetが対象になってしまってサイズが肥大化する事があり、どうして対象となるのか調べる術を探していました。(一個ずつ見ていくのは無理…)
非常に参考になったのがこのサイト、本当にありがたいです。
Unityで管理しているAssetには全てguidが振られており、そのguidを保持する事で参照関係を保っているのですね。
まず、ビルドに含まれてしまっているAssetを特定(例えばC.png)し、そのファイルのメタファイル(C.png.meta的なやつ)をテキストエディタで開く。すると「guid: xxxxxxxx」という表記が2行目くらいにあるのでそれをコピー。
UnityプロジェクトのAssetフォルダ以下をgrep等のテキスト検索でサーチすると参照元を割り出す事ができます。(前提条件として、Unityファイルのテキスト出力は必須ですね)
ビルドに含まれる条件として以下が挙げられます(全てではないかもしれません)
・「Build Settings」の「Scenes In Build」でチェックが付いているシーンファイルで参照しているAsset、およびそのAssetが参照しているAsset、およびその・・・
・「Resources」フォルダ以下に入っているAsset、およびそのAssetが参照しているAsset、およびその・・・
要するに、ビルドに含まれてしまっているAssetのguidを参照しているAssetを探して、上記2パターンのどちらかに辿りつくはずなので、参照しないように変える。
例えば resources/A.prefab で参照している B.mat で参照している C.png 、という関係であれば、A.prefabで別のマテリアルを参照させるなど。
著者:t.n