太郎Work

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

ノイズエフェクト作ってみた

とある理由で思い立ったので勉強も兼ねてモニターノイズ風エフェクトを実装してみました

f:id:tarowork:20140428011714p:plain
https://googledrive.com/host/0BzRQHdfTLNehbVRHaF9DVElDYzA/NoiseWeb.html

手順
RenderTextureなのでPro必須

まずはユニティちゃんに登場してもらいます
f:id:tarowork:20140426231718p:plain

  • OnRenderImageでEdgeDetectを処理

Unityの用意しているEdgeDetectShaderに実装されているものから3D空間向けに
TriangleDepthNormals、画像系向けにTriangleLuminanceのfragmentシェーダをベースにして背景と線画の色を切り替えられるシェーダを実装

f:id:tarowork:20140426235633p:plain
この後更にエフェクトをかけるので黒に白線画で描画

  • Mathf.PerlinNoiseで生成した画像を用いて一部水平領域を除去

f:id:tarowork:20140427023158p:plain

  • Blurエフェクトをカスタマイズしたシェーダを実行する

f:id:tarowork:20140427023519p:plain
これにより横にこすった感じになる

  • 出来上がったピクセル移動量を定義したテクスチャを用いて元画像に適用

f:id:tarowork:20140427023745p:plain

  • 上部を横にスライドさせるシェーダ適用、ついでにUnityのノイズエフェクト

f:id:tarowork:20140428001424p:plain

特に調べたりせずにイメージでノイズっぽいものを作ってみましたが案外それっぽく見える?
何か動画を参考にしながら作ればもっといい感じになったかも

作ってて思ったけど線画抽出はあまり意味がなかった。
Texture全体に処理をかけているのでPostProcess負荷は結構あがってしまいました。モバイルでは無理かな?

作っている間にいろいろとシェーダの勉強ができたのでやってよかったと思う。
シェーダ面白い

PlayerSettingsのアイコンをEditorから変える

dev版とrelease版で切り替えるEditorを作っていたのですが、アイコンも変えようと思ったら簡単に変えられたのでメモ

var icons = PlayerSettings.GetIconsForTargetGroup (BuildTargetGroup.Unknown);
if (icons != null && icons.Length > 0) {
    player.icon = icons [0];
}

if (player.icon != null) {
    PlayerSettings.SetIconsForTargetGroup (BuildTargetGroup.Unknown, new Texture2D[]{ player.icon });
}

ScriptableObjectのクラスで値を書き換えてAssetDatabase.SaveAssetsで保存しています。
Texture参照を保存できるので便利です。

UnityiOSのdevelopment build の場合スプラッシュスクリーンで止まる

UnityのiOS書き出しの際development buildにチェックを入れて出力すると
スプラッシュスクリーン表示中に停止してしまう問題が有り、解決に時間がかかったのでメモ

XCodeのLogを確認すると別スレッドからアクセス出来ない的な文章が出ているのみで
空のシーンを起動しても変わらず。

結局MonoBehaviourを継承していない普通のクラスのstaticフィールドでUnityのメソッドを呼んでいることが原因だった。

public static readonly Dictionary<eTest, string> dic = new Dictionary<eTest,string>() {
  {eTest.TEST1, Localization.Localize("test1")},
  {eTest.TEST2, Localization.Localize("test2")},
};

初期化時にローカライズのテキストをenumで取得できるようにしたかったがこの記述があるだけで呼んでいなくても停止してしまった。

挙動をまとめました。

non develop develop
Editor 動作 動作
iOS Localizationが初期化されずに動作 スプラッシュスクリーンで停止

Editor上だと何も問題なく動作してしまうため発見が遅れました。

なので必要になった時取得するように変更しました。

private static readonly Dictionary<eTest, string> _dic;
public static Dictionary<eTest,string> dic {
  if(_dic == null) {
    _dic = new Dictionary<eTest,string>() {
      {eTest.TEST1, Localization.Localize("test1")},
      {eTest.TEST2, Localization.Localize("test2")},
    };
  }
  return _dic;
}

Logを出してみるとUnityのAwake等よりも先にUnityでない通常クラスのstaticフィールドのコンストラクタが呼ばれるようです。

Editor上だと再生時にエラーは出ないが一度失敗してからUnityのAwake等のタイミングでまた呼ばれていることが確認できました。

なので、iOSのdevelopmentだと何か挙動が挟まるせいでUnity起動の前にクラスの初期化が呼ばれてるようです。

皆様もiOSのdevelopmentビルドのみ起動出来なくなった場合はこういったコードがどこかに埋まってないか確認してみてください。

Unityで文字エスケープ変換

C#でやろうとしていたがUnityに実はあったのでメモ

http://docs.unity3d.com/Documentation/ScriptReference/WWW.UnEscapeURL.html

WebViewのjsからJSON適当に送ろうとしたらエスケープ文字で来るのでこれで簡単に変換できる

WWWは結構使っていたがこのメソッドが目に入っていなかった。

ありがとうUnity

UnityのiOSディレクトリアクセスまとめ

結構複雑で忘れてしまったのでメモ 一部間違っているかもしれません。

Documents

バックアップ対象になるセーブデータ等の重要なファイルを保存 Application.persistentDataPath

Library/Preferences

バックアップ対象になる環境設定ファイル等 ・Unityからアクセスすることは多分ない

Library/Caches

バックアップされないがアプリを終了しても消されない領域、大量の画像データとか しかし、容量不足の場合消される可能性あり。ロード時は存在しない前提で実装する Application.temporaryCachePath

tmp

バックアップされずアプリが終了したら削除される領域。一時保存ファイルとか Cachesと違い、実行中は削除されないことが保証される

Unity4.3で作成したアニメーションがLegacyと言われて動かない

Unityに標準で組み込まれているAnimationは、NGUI等の通常オブジェクトにも簡単にアニメーションが追加でき、publicなパラメータもアニメーションで来て非常に便利。

特にUnity4.3で導入されたDopeSheetのお陰で劇的に作りやすくなった。

しかし、いざGameObjectに追加しようとすると今まではAnimationComponentが自動でアタッチされていたものがAnimatorになってしまう。 確かに動くが、スクリプトからスタートとストップが弄れない! 空のStateをデフォルトにして遷移させれば動きそうだが単純に再生させたいだけなのにState管理とかやりたくない。

方法があるのかもしれないが、殆どがやっぱりAnimationの説明でAnimatorはインポートされたモデルアニメーションの説明ばかり。

そこで諦めてComponentからAnimationを追加してクリップを追加したらアニメーションが再生されず、アニメーションクリップをLegacyにしろと言われて動かない…

モデルデータならインポート設定にLegacy項目があるが、Unity上で作ったのだからあるわけない…

4.3以前に作成したアニメーションはやっぱり普通に動くので調べたら同じ問題で困っている質問を発見。

Create a legacy animation without a model - Unity Answers

まさに同じ状況。

EditorをForceTextにしてから、.animファイルをテキストエディタで開いて以下のように修正

m_AnimationType: 2 -> m_AnimationType: 1

これで今までどおりの使い方が出来るようになった。animationでのアクセスも問題なし。

前回のEditorWindowで<size=~>が使えなくなっている件といい、地味に4.3で謎の改変が入っている。

最終的にAnimationからAnimatorにフェードしていくらしいけどAnimationのシンプルさは残しておいてほしいなあ…

他にもなにかありそうで怖くなってきた。。。

EditorWindowでのフォントサイズ設定

今までEditorWindow上の文字サイズを変更する際は

GUILayout.Label("<size=32>Test</size>");

のように指定していたのだが、恐らくUnity4.3にしてからこの指定が出来なくなっていた。

これを使うとボタン等も簡単にフォントサイズが変更できて重宝していたが、削除されたのだろうか…

でもDebug.Logでは今までと同じように使用できるのでますますわからない。

結局普通?に

GUI.skin.label.fontSize = 32;
GUILayout.Label("Test");
GUI.skin.label.fontSize = 0;

で対応したが3行になるのは気持ち悪い。

もちろんGUIStyleを保存しておいて代入でも大丈夫だけど、なんだかなぁ…