投稿者 tel | 2016年8月3日

MonoDevelopのコード整形を無効にする

MonoDevelopで勝手にコード整形されないようにする方法。

mono_ss

OptionからBehaviorのEnable on the fly code formattingのチェックを外す。

投稿者 tel | 2016年7月19日

AnimatorOverrideControllerのメモ

UnityのAnimatorOverrideControllerを使うと既存のAnimatorControllerのAnimationClipを置き換えることができる。
http://docs.unity3d.com/ja/current/Manual/AnimatorOverrideController.html
例えばゲームのモンスターのアニメーションでステートとトランジションは共通でバリエーションを作るときなど便利に使える。

ただアセットバンドル化した時に置き換えた元のアニメーションも含まれているようで、ファイルサイズが大きくなってしまった。

実験

  • アニメーションクリップClipAとClipBを割り当てたAnimatorCntrolerを作成する。(controller0、controller1)
  • AnimatorOverrideControllerを作ってClipAを割り当てたAnimatorControllerを参照し、ClipAをClipBで置き換える。
  • それぞれをアセットバンドル化する。

overridecontroller_ss

それぞれのファイルサイズは以下のようになった。

  • controller0:101KB
  • controller1:139KB
  • overridecontroller:226KB

まとめ

ステートを使い回す目的でOverrideAnimatorControllerを使うとアセットバンドルのサイズが大きくなってしまう。
そのためダミーのサイズが小さいアニメーションを付けておくか、AnimatorControllerを複製して使うような運用が必要になりそう。

投稿者 tel | 2016年7月15日

1ドットのアウトラインを描く

1ドットのアウトラインを描画する方法を考えてみた。

outline_ss outline_ss02

図のように緑の部分と青の境界部分に1ドットの赤い線を描く。

  • 緑の部分を塗りつぶし処理で領域を取得。
  • 塗りつぶした領域を収縮させる。
  • 収縮した部分を任意の色で描画する。

塗りつぶし

同じ色の範囲を領域として取得する。
領域取得用に2値の画像と同じサイズのバッファを用意する。効率は良くないが今回は再帰的に塗りつぶす手法を使った。

// c: 塗りつぶす範囲の色
// data: 元の画像
// tmp: 塗りつぶし範囲のバッファ
// x, y: 開始座標
(function f(x, y) {
    if(x >= w || x < 0) return;
    if(y >= h || y < 0) return;
    if(data[y * w + x] === c && tmp[y * w + x] === 0) {
        tmp[y * w + x] = 1;
        f(x - 1, y);
        f(x + 1, y);
        f(x, y - 1);
        f(x, y + 1);
    }
})(x, y);

領域収縮(erosion)

収縮は対象の領域を1画素分小さくする処理。注目した画素の周りに違う色の画素があった場合にその画素をけずる。
4近傍で見るので上下左右の画素をチェックしている。

for(var i = 0; i &lt; h; i++) {
    for(var j = 0; j &lt; w; j++) {
        var k = i * w + j,
            p = tmp[k] === 1,
            b = false;
        if(i &gt; 0) b |= tmp[k - w] === 0;
        if(i &lt; h - 1) b |= tmp[k + w] === 0;
        if(j &gt; 0) b |= tmp[k - 1] === 0;
        if(j &lt; w - 1) b |= tmp[k + 1] === 0;
        if(p &amp;&amp; b) {
            data[i * w + j] = newColor;
        }
    }
}

削った部分がアウトラインになるので指定の色で塗っている。

結果

outline_ss

紫色の部分を指定して中央の領域のアウトラインを白で描く。

outline_ss2

 

通常は適切なシェーダを使っていれば描画順番を気にする必要はない。どうしても半透明のものの重なりがうまくいかないときにMaterial.renderQueueを設定する。

http://docs.unity3d.com/jp/current/ScriptReference/Material-renderQueue.html

インスペクタをデバッグ表示にすれば設定できるが、それだと分かりづらいのでエディタ拡張でマテリアルのRenderQueueを設定できるようにする。

renderqueue_ss

RenderQueueでやるよりもRenderer.sortingOrderとかで設定したほうがいいかもしれない。

FBXのインポート設定でリグの階層構造を最適化できる。こうすることでシーンに配置した時にオブジェクト数が少なくなって軽くなる。

hierarchy_ss2 hierarchy_ss3

Animatorのメニューの Optimize Transform Hierarcy からも同様の設定ができる。

animator_ss

ただしここから設定した場合、FBXのインポート設定の Extra Tranforms to Expose が反映されない。

rig_ss

また Optimize Transform Hierarcy してから Deoptimize Transform Hierarcy したときに階層構造が元に戻らない場合がある。

hierarchy_ss

1番目が最適化なし、2番目が Optimize Transform Hierarcy をした状態、3番目が Optimize Transform Hierarcy をしたあとに Deoptimize Transform Hierarcy をした状態。PC_01_Kohakuの位置が変わってしまっている。

まとめ

  • モバイル環境などではパフォーマンスを稼ぐために最適化はしておく。
  • 階層構造の最適化の設定はFBXのインポート設定で指定しておくのが問題が出にくそう。
  • Animator からの設定は確認用途で使う。(FBXで設定していた階層構造の最適化を一時的に戻してノードの座標とか見たい時とか)

サンプルとしてLowPolyUnityChanを使用しています。

 

投稿者 tel | 2016年5月3日

Unityでエフェクトを軽くする

UnityのShurikenで集中線エフェクトを作る。

line_ss0

長細いパーティクルを円状に配置して外側に向かって飛ばしている。

続きを読む…

投稿者 tel | 2016年4月27日

UnityでPIDを表示する

通信のテストとかするときに複数Unityを立ち上げる場合がある。

このときMonoDevelopでデバッグしようとするとどのUnityをデバッグするか選ばないといけない。

attach_ss

PIDが書いてあるがタスクマネージャ見ても同じ名前なので分からない。なのでPIDを表示するメニューを用意する。
UnityのプロセスのPIDは以下のコードで取得できる。

Process.GetCurrentProcess().Id

pid_ss

コンソールにPIDが表示されるのでデバッグでアタッチするのがどれか分かる。

投稿者 tel | 2016年4月25日

デバッグログをフィルタリングする

複数人で開発をしているといろんな箇所でデバッグログが出力されて自分の必要なログが埋もれてしまうことがよくある。
なのでログ関数にタグを付けられるようにして、個々の人が必要なログだけ見られるようにする。

LogUtil.Log(LogUtil.Filter.A, &quot;A&quot;);

ログ関数にはConditional属性をつけてリリース時には呼び出しが消えるようにしておく。
ついでにエディタ拡張でフィルタするログを選べるようにした。

filter_a

タグを文字列にしようかとも思ったけど、比較が面倒なのとつづりを間違える可能性があるのでEnumにした。

投稿者 tel | 2016年3月14日

Unityでの日本語名のメッシュ

Blenderなどで日本語名のオブジェクトを作ってFBXでUnityに持って行くとUnity5だと正しく表示されるがUnity4だとメッシュ名が___になってしまう。

blender_ss

unity5_ss unity4_ss

左がUnity5。

これが問題になるのはUnity4のプロジェクトをUnity5にアップグレードした時。プレハブに日本語メッシュが付いているとメッシュが外れてしまうので再度設定しないといけない。

missing_ss

よくわからない現象に遭遇したのでメモ。

Unity4.6で作ったプロジェクトをUnity5にアップグレードしたらLightのIntensityが2倍になった。

Unity4.6.9p4でシーンにDictional Lightを置いて保存。このときIntensityは0.5(デフォルト)。

unity_46

Unity 5.3.3で開いてプロジェクトをアップグレードすると置いてあったライトのIntensityは1.0になった。

unity_53

検索したらアップグレードガイドにそれっぽいものが書いてあった。

Shaders no longer apply a 2x multiply of light intensity

http://docs.unity3d.com/Manual/UpgradeGuide5-Shaders.html

 

« Newer Posts - Older Posts »

カテゴリー