太郎Work

Unityとかで困ったこと等を残しておきます

UnityのArialフォントがAndroid実機上で表示されない場合がある

問題

Unity上のシステムフォントテキスト設定でデフォルトのArialのままAndroidビルドを行った場合、
確認できただけですが、LG-02E, GalaxyS5で日本語フォントが表示されない問題があります。

理由

どうやら挙動的にはDroid Sansというフォントがロードされているようで上記の端末には英語と韓国語しか入っていませんでした。
そのため日本語が表示されないという問題です。日本で発売している端末なのにひどすぎる…

解決

どちらにしろDroid Sansはフォントが汚いのでこちら側で指定しました。

Unityに適当な日本語に対応したttfをインポートし、以下のように設定すると問題なく表示されます

・Incl. FontDataをfalse
・Font NamesをMotoyaLMaru, MotoyaLCedar, RobotoSansFallback, Droid Sans Fallbackと指定
f:id:tarowork:20141121171323p:plain

これで日本語が表示されます。ここで使用したttfファイルはビルドに含まれないことも確認しました。

しかし、今度はGalaxyS5だとモトヤフォントに韓国語と中国語が入っていないという問題が発生しましたがそれに対しては対応できていません。
(L-02Eの方はちゃんと入っていました)

海外の端末ではMotoyaではなくRobotoが呼ばれ、昔の端末ではDroidSansが呼ばれるはずなのでひと通り網羅できるのではないかなと思います。

Unityの端末向き設定

随分前に調べて忘れないようメモ

UnityiOS,Androidで横向きのアプリを作成する際、PlayerSettingsから回転設定を指定しますが、
一方向固定又は自動回転しか設定ができません。

f:id:tarowork:20141001134524p:plain

Landscape Right Left
的なものが欲しいのですが複数選択できません。

その場合最初のシーンに配置されているスクリプトのStartに以下のコードを書くと実現できます。

Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
Screen.orientation = ScreenOrientation.AutoRotation;

これで横持ちをしても自動で回転してくれるようになります。
Unity側の設定はLandscape Right, Landscape Leftどちらでも問題ありません。起動後に自動回転します。

Unityステンシルでポストエフェクト

前回の記事ではステンシル情報を用いてアウトラインを表現しましたが、
せっかくステンシル情報を書き込んだのでポストエフェクトにも応用してみました

f:id:tarowork:20140803012110p:plain
キャラクターだけモザイク処理

f:id:tarowork:20140803012144p:plain
ステージのみモノクロ

Terrainの草にシェーダを指定する方法が分からなかったのでその部分にステンシルをかけられませんでした。

WebPlayer版
右側にあるボタンでモザイク、モノクロ、通常と前回の記事のアウトラインが切り替えられます。
Stencil Test

続きを読む

Unityでステンシルを用いたアウトライン表現

f:id:tarowork:20140725005608p:plain
最終的にこんな感じになります。
WebPlayer版 Windowsで見ると表示がおかしい可能性があります
Stencil Test

はじめに

なぜ急にアウトラインかというときっかけは白猫プロジェクトでした。
遊んでいて真っ先に気になったのがタイトルにもあるキャラクターのアウトライン表現でした。
f:id:tarowork:20140724004610p:plain
プレイ画面のキャプチャ

続きを読む

NGUIではないオブジェクトをNGUIの手前に描画するスクリプト作ってみた

以前の投稿で

NGUIではないオブジェクトをNGUIの手前に描画する方法 - 太郎Work

このような記事を書きましたが、ParticleSystemやメッシュを手前に持ってきたい場合や任意の場所に挟みたい場合は非常にめんどうでした。

やはりNGUIのdepthで管理したくなったのでコンポーネントを作成しました。

注意!:NGUI3.x用です
tarob19/UIUnityRenderer · GitHub

実行例

後ろからdepth0, depth2, depth4で指定したUITextureにParticleSystemを入れた場合の実行結果です
直感的に任意のレイヤーにParticleが表示できているのがわかると思います。
コンポーネントに最終的なRenderQueueの確認もできるようにしました。
もちろんNGUIのDrawCallToolでも見られます。

f:id:tarowork:20140608214334p:plain
depth = -1 一番裏側

f:id:tarowork:20140608214438p:plain
depth = 1

f:id:tarowork:20140608214505p:plain
depth = 3

f:id:tarowork:20140608214532p:plain
depth = 5 最前面

ParticleSystemと同じGameObjectにアタッチしてUIPanel以下に入れるとUIWidgetのdepthで管理できるようになります。
使いたい方はどうぞ。ただし使ったことによる責任は一切負えません

以下詳細

GetComponentでRendererを取得してNGUIにWidgetとして登録しています。

OnFillで画面外にダミーのメッシュ情報をセットしておくことで、かならず1drawCall発生するようにしています。
ただし、画面外に描画されるためUnityの方でカリングされるので無駄なDrawCallは発生せずRendererのDrawCallのみなのでご安心下さい。

depthを操作するとUIDrawCallが書き換わるのでその値をコピーしたMaterialにセットしています。

しかし、デフォルトではこれは実行時のみ適用するようにしています。
これは、SharedMaterialを書き換えるとProjectのマテリアル情報が随時書き換わるためバージョン管理をしている場合UIPanelを操作する度に変更点として上がってしまうためです。

そんなことは気にしないor実行前に確認したいという方はUseSharedMaterialにチェックを入れるとRendererのマテリアルを直接操作するようになります。

とりあえず複数マテリアルに対応しましたが本当に動くかは分かりません。
UIWidgetのmPlayModeがうまく取れなかったので毎フレームチェックになってしまいました。。。

試行錯誤で結構苦労したけど最終的に良い感じになってよかった。

WWWクラスでBASIC認証

WWWを用いてBasic認証をする場合少しつまずいたのでメモ
https://docs.unity3d.com/Documentation/ScriptReference/WWWForm-headers.html

ここにまさにBasic認証の方法が書かれているがこのまま書くとPOSTリクエストになってしまう
GETでリクエストを送る場合はWWWの第2引数のbyte[]をnullに指定すればOK

いくらなんでも低機能すぎるだろう…WWWクラス