カウンセリングエンジニア

産業カウンセラーの有資格者が発信します。カウンセリング、マネジメント、Unityあたりの内容多めで構成する予定です

iOS実機でLight Probe Groupを含むSceneのUnload時にクラッシュする

概要

iOS実機でLight Probe Groupを含むSceneのUnload時にクラッシュする現象が起きたため調査しました。
その結果わかった原因と解決策について記載します。

環境

Unity 2018.2.16f1

原因

Strip Engine Codeが有効になっていてLight Probe GroupがiOSビルド時に削除されていた

AssetBundle化したSceneをロードして使用するフローで開発していたため、
Light Probe Groupがアプリ内で使用されていない扱いとなり削除されていたようです。

特定方法

SRDebuggerを使って実機でログを確認したところ

Could not produce class with ID 220

というエラーログが出ていて、

YAML クラス ID リファレンス - Unity マニュアル

で調べたところ|220 |LightProbeGroup | と書いてあったので原因特定にいたりました。

解決策

tsubakit1.hateblo.jp

テラシュールブログを参考に link.xmlを記述してLight Probe Groupをストリップしないコンポーネントとして指定することで回避しました。

まとめ

テスト用に最小構成のプロジェクトを作って試したりしたのですが、
その際SceneのAssetBundle化までは行わずにテストしていたためかなり苦戦しました

実機でログ確認出来る環境は必須ですね。

Post Processing Stack v2にカスタムエフェクトを追加する方法

はじめに

github.com

こちらの記事を参考に、PostProcessingStackに自作のポストエフェクト(カスタムエフェクト)を追加する方法をまとめます。

概要

f:id:pond-comfat:20190123024451p:plain

Unityちゃんと背景Assetを配置したSceneを用意します。
ゲームボーイ風の表示にするカスタムエフェクトを追加し、
下記の表示にするまでの手順を解説していきます

f:id:pond-comfat:20190123024515p:plain

wordpress.notargs.com ゲームボーイ風ポストエフェクトはこちらの記事を参考にさせていただきました。 ありがとうございます。

環境

Unity 2018.2.16f1
Post Processing Version 2.1.2

実装

カスタムエフェクトを追加するには下記の4つが必要です

  • PostProcessEffectSettingsを継承したSettingクラス
  • PostProcessEffectRendererを継承したRenderingLogicクラス
  • Shader
  • CustomEditor(エディタ拡張したい時のみ作成。今回は使用していません)

PostProcessEffectSettingsを継承したSettingクラス

カスタムエフェクトで使用するパラメータを定義するクラスです。
注意する点に関して補足していきます。

カスタムエフェクトの実行タイミングについて

[PostProcess()]attributeの2番目の引数でカスタムエフェクトの実行タイミングを下記の3種類から指定できます。

  • PostProcessEvent.BeforeTransparent
    • 半透明描画の前に実行される。不透明なオブジェクトにのみカスタムエフェクトが適用される
  • PostProcessEvent.BeforeStack
    • Build-inのPostProcessingStackの実行前に実行される
  • PostProcessEvent.AfterStack
    • Build-inのPostProcessingStackの実行後に実行される
パラメータの指定方法について

先述のソースコードを見ていただくと、colorやfloatではなく

public ColorParameter color1 = new ColorParameter { value = Color.gray };

や、

public FloatParameter paletteWidth = new FloatParameter {};

のように HogeHogePrameterを使用しているのが分かると思います。
HogeHogePrameterを使用しているとPostProcessingVolumeのblend時に補完さるようになります。
基本的にはHogeHogePrameterを使用するようにするのがおすすめです。

使用できるPrameterの一覧は/PostProcessing/Runtime/ParameterOverride.csの中に定義されています。

Validationをかける方法について

Settingクラスの中で IsEnabledAndSupported() メソッドをoverrideすることにより、カスタムエフェクトにvalidationをかけることができます。

(例)paletteWidthが1以上の時のみカスタムエフェクトを有効にする

public override bool IsEnabledAndSupported(PostProcessRenderContext context)
{
    return enabled.value && paletteWidth.value >= 1f;
}

PostProcessEffectRendererを継承したRenderingLogicクラス

RenderingLogicを記載するクラスです。
上記のように、shaderに対してsettingsで定義したパラメータをわたします。

Shader

カスタムエフェクトの本体となるshaderです。
StdLib.hlslをincludeする際はUnityのバージョンによって指定方法が違うみたいなので注意してください。
In Unity 2018.2

#include "PostProcessing/Shaders/StdLib.hlsl"

In Unity 2018.3

#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"

これで実装完了です。
この後は実際にPostProcessVolumeから上記のカスタムエフェクトを追加していきます。

カスタムエフェクトを追加する

f:id:pond-comfat:20190123025709p:plain

PostProcessVolume > Add effect から、作成したカスタムエフェクトを選択します。

f:id:pond-comfat:20190123025850p:plain

以上でカスタムエフェクトを追加することができました。

f:id:pond-comfat:20190123031630g:plain

FloatParameterとColorParameterを使って実装しているためブレンドもしっかり効きます

番外編(複数のカスタムエフェクトの実行順指定)

カスタムエフェクト同士の実行順序はPostProcessLayerのInspector上で指定することができます

f:id:pond-comfat:20190123031038p:plain
Grayscale > ColorPaletteの順番

f:id:pond-comfat:20190123031134p:plain
ColorPalette > Grayscale の順番で実行

参考

Writing Custom Effects · Unity-Technologies/PostProcessing Wiki · GitHub

[Unity]4色のカラーパレットだけで画面を描画するポストエフェクトを作った | notargs.com

GitHub - keijiro/Flipbook: Flip book effect example for Unity

Unityで数種類のエッジ検出を比べてみた(Sobel,Prewitt,Roberts Cross)

始めに

エッジ検出のShaderを書く機会があり調べたところ、
エッジ検出にも様々な手法があることがわかりました。
なので、調べている中でよく見かけた

  • Sobel Filter
  • Prewitt Filter
  • Roberts Cross

のそれぞれの手法での結果を比べてみます。

環境

Unity2018.2.16f1
Scriptable Render Pipelineは未使用

用意

f:id:pond-comfat:20190114171809p:plain

このシーンを元にエッジを検出します

実装

結果

Sobel Filter

f:id:pond-comfat:20190114220607p:plain

Prewitt Filter

f:id:pond-comfat:20190114220655p:plain

Roberts Cross

f:id:pond-comfat:20190114220726p:plain

まとめ

思いの外違いが感じられない結果となりました(^^;)w
上記の中だとRobertsCrossの手法が4点のみのサンプリングで一番負荷が軽そうなので基本的にはRobertsCrossを使った実装を採用しようかなと思います。

参考

UnityのImage EffectでSobelフィルタによるエッジ検出 - Qiita

【Unity】【シェーダ】ソーベルフィルタでエッジを抽出する - LIGHT11

GitHub - keijiro/KinoContour: Contour line filter for Unity

技術書典なるものがあるらしい

技術書典とは

技術書オンリーの同人誌イベント 半年に1回のペースで開催していて現在までで3回開催している。 公式サイトはこちら(https://techbookfest.org/)    

技術書典の趣旨

技術書店の趣旨については公式サイトにありましたので引用します。

新しい技術に出会えるお祭りです。 技術書典は、いろんな技術の普及を手伝いたいとの想いではじまりました。  技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める、技術に関わる人のための場として『技術書典』を開催します。

この趣旨からも技術に対する暑い思いがひしひしと伝わってきます。

イベントの様子

自分は未だ未参戦のためネットで色々見てみましたが、イベントの様子はこちらの記事を参考になりました。

knowledge.sakura.ad.jp

技術書を販売しているだけでなく企画スペースのようなものでイベントも行われているみたいですね。

感想

技術書を通じて新しくコミュニティが形成されている感じがすごくいいなと思いました。 勉強会のようなイベントにはたまに行く程度なのですが、そこでできたつながりだったり、そうした場でたまたま興味を持って勉強した技術が今にいきてきてたりします。 次回開催があれば是非行こうと思います。

あと、この技術書が面白そうだったので購入してゆっくり読もうと思います。 indievisuallab.stores.jp