SetReplacementShaderの使い方
公式の説明が全く意味不明だったのでメモ
Unity - Manual: Rendering with Replaced Shaders
カメラに映る全体を単一シェーダで描画したい場合は呼び出すだけ。
camera.SetReplacementShader (shader, null);
問題は特定のシェーダの場合のみ描画したい場合。
第2引数にカスタムタグの「キー」を指定すると、差し替えるシェーダに指定されているタグと対象にセットされているシェーダに指定されているカスタムタグの「値」が一致していた場合描画される。
ここを理解するのに時間がかかりました…
shadowcamera.cs
camera.SetReplacementShader (shadow, "Shadow");
shadow.shader
Tags { "RenderType"="Opaque" "Queue"="Geometry" "Shadow"="Character" }
character.shader
Tags { "RenderType"="Opaque" "Queue"="Geometry" "Shadow"="Character" }
このようにするとUnity側がShadowタグを確認しここではCharacterが共通なため描画される仕組み。
他のシェーダにはそもそもShadowタグが存在しないので無視されます。
これでキャラクターのみの自前シャドウマップが作成出来ました。
めでたしめでたし
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と指定
これで日本語が表示されます。ここで使用したttfファイルはビルドに含まれないことも確認しました。
しかし、今度はGalaxyS5だとモトヤフォントに韓国語と中国語が入っていないという問題が発生しましたがそれに対しては対応できていません。
(L-02Eの方はちゃんと入っていました)
海外の端末ではMotoyaではなくRobotoが呼ばれ、昔の端末ではDroidSansが呼ばれるはずなのでひと通り網羅できるのではないかなと思います。
Unityの端末向き設定
随分前に調べて忘れないようメモ
UnityiOS,Androidで横向きのアプリを作成する際、PlayerSettingsから回転設定を指定しますが、
一方向固定又は自動回転しか設定ができません。
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どちらでも問題ありません。起動後に自動回転します。
Sublime Textで改行を置換する
Sublimeで改行コードを置換したかったが日本語の情報が見つからなかったのでメモ
二通りの方法がある
1. Regular Expressionにチェックを入れて\nを入力
2. Command+Enterで改行を直接入力
あとは置換後の文字列を入れてReplaceするだけ
Unityステンシルでポストエフェクト
前回の記事ではステンシル情報を用いてアウトラインを表現しましたが、
せっかくステンシル情報を書き込んだのでポストエフェクトにも応用してみました
キャラクターだけモザイク処理
ステージのみモノクロ
Terrainの草にシェーダを指定する方法が分からなかったのでその部分にステンシルをかけられませんでした。
WebPlayer版
右側にあるボタンでモザイク、モノクロ、通常と前回の記事のアウトラインが切り替えられます。
Stencil Test
Unityでステンシルを用いたアウトライン表現
最終的にこんな感じになります。
WebPlayer版 Windowsで見ると表示がおかしい可能性があります
Stencil Test
はじめに
なぜ急にアウトラインかというときっかけは白猫プロジェクトでした。
遊んでいて真っ先に気になったのがタイトルにもあるキャラクターのアウトライン表現でした。
プレイ画面のキャプチャ
NGUIではないオブジェクトをNGUIの手前に描画するスクリプト作ってみた
以前の投稿で
NGUIではないオブジェクトをNGUIの手前に描画する方法 - 太郎Work
このような記事を書きましたが、ParticleSystemやメッシュを手前に持ってきたい場合や任意の場所に挟みたい場合は非常にめんどうでした。
やはりNGUIのdepthで管理したくなったのでコンポーネントを作成しました。
注意!:NGUI3.x用です
tarob19/UIUnityRenderer · GitHub
実行例
後ろからdepth0, depth2, depth4で指定したUITextureにParticleSystemを入れた場合の実行結果です
直感的に任意のレイヤーにParticleが表示できているのがわかると思います。
コンポーネントに最終的なRenderQueueの確認もできるようにしました。
もちろんNGUIのDrawCallToolでも見られます。
depth = -1 一番裏側
depth = 1
depth = 3
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がうまく取れなかったので毎フレームチェックになってしまいました。。。
試行錯誤で結構苦労したけど最終的に良い感じになってよかった。