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がうまく取れなかったので毎フレームチェックになってしまいました。。。
試行錯誤で結構苦労したけど最終的に良い感じになってよかった。
WWWクラスでBASIC認証
WWWを用いてBasic認証をする場合少しつまずいたのでメモ
https://docs.unity3d.com/Documentation/ScriptReference/WWWForm-headers.html
ここにまさにBasic認証の方法が書かれているがこのまま書くとPOSTリクエストになってしまう
GETでリクエストを送る場合はWWWの第2引数のbyte[]をnullに指定すればOK
いくらなんでも低機能すぎるだろう…WWWクラス
ノイズエフェクト作ってみた
とある理由で思い立ったので勉強も兼ねてモニターノイズ風エフェクトを実装してみました
https://googledrive.com/host/0BzRQHdfTLNehbVRHaF9DVElDYzA/NoiseWeb.html
手順
RenderTextureなのでPro必須
まずはユニティちゃんに登場してもらいます
- OnRenderImageでEdgeDetectを処理
Unityの用意しているEdgeDetectShaderに実装されているものから3D空間向けに
TriangleDepthNormals、画像系向けにTriangleLuminanceのfragmentシェーダをベースにして背景と線画の色を切り替えられるシェーダを実装
この後更にエフェクトをかけるので黒に白線画で描画
- Mathf.PerlinNoiseで生成した画像を用いて一部水平領域を除去
- Blurエフェクトをカスタマイズしたシェーダを実行する
これにより横にこすった感じになる
- 出来上がったピクセル移動量を定義したテクスチャを用いて元画像に適用
- 上部を横にスライドさせるシェーダ適用、ついでにUnityのノイズエフェクト
特に調べたりせずにイメージでノイズっぽいものを作ってみましたが案外それっぽく見える?
何か動画を参考にしながら作ればもっといい感じになったかも
作ってて思ったけど線画抽出はあまり意味がなかった。
Texture全体に処理をかけているのでPostProcess負荷は結構あがってしまいました。モバイルでは無理かな?
作っている間にいろいろとシェーダの勉強ができたのでやってよかったと思う。
シェーダ面白い