MRが楽しい

MRやVRについて学習したことを書き残す

球体が弾け飛びユニティちゃんが現れる

以前紹介した下記のページには"TiledWall"シェーダ以外にも様々なシェーダが紹介されています。
今回はその中でもポリゴン分解を行うシェーダを使ってみます。
・HoloLens で使える Near Clip 表現について解説してみた
 http://tips.hecomi.com/entry/2017/03/27/003631

利用したのは"HoloLens/NearClip/DestructionAdditiveGS"というシェーダです。
シェーダとは3Dポリゴンの色の見た目を決めるものとばかり思っていました。
ポリゴン変形が可能とは驚きです。

利用方法として、球体のオブジェクトをタップすると、そのオブジェクトが分解する。
すると、球体の中からユニティちゃんが出てくる…という演出に利用することを考えました。

実現にはタップ操作が行われたときに、シェーダのプロパティを操作する必要があります。
しかしシェーダとはいえ、他のコンポーネントとそれほど操作方法は変わりません。
変数の参照方法に少し確認が必要なくらいでした。
・マテリアルのプロパティをスクリプトから変更【Unity】
 http://kan-kikuchi.hatenablog.com/entry/Material


マテリアルの反映とスクリプトの修正を行い、動作を確認します。
f:id:bluebirdofoz:20170418012509j:plain
起動時、目の前に白い球体が表れます。この球体をタップすると…
f:id:bluebirdofoz:20170418012531j:plain
オブジェクトが弾け飛び、中からユニティちゃんが表れました。


写真では良い感じに撮っていますが、今のままだと様々な問題があります。
まず球体にもアタリ判定があるため、シェーダを消しただけだと、障害物に干渉しまくります。
シェーダを消した後、球体オブジェクトそのものを無効化する必要があります。
あと画像では上手く隠していますが、ユニティちゃんの足が球体から飛び出しています。
奇麗に見せるには初め、ユニティちゃんは縮こまっていて、エフェクトと共に立ち上がるようなアクションが必要です。
更に球体がライティング無関係の真っ白です。これは元のシェーダを修正する必要があります。。
f:id:bluebirdofoz:20170418012746j:plain
プロジェクトで見ると、今はこんな感じです。

この辺を凝りだすと、コードをひたすらゴリゴリ書くだけの作業となってしまうのでブログとしては悩みものです。。
ただ、私のモチベーションとしては一先ずこのアプリに集中したいのでブラッシュアップは進めたいと思います。
その中で新しい技術が欲しくなることもあるでしょう。


今回は問題ありませんでしたが、シェーダのコードによっては下記のような問題も発生する模様です。
情報として残しておきます。
・Unity5のStandardシェーダのパラメタをスクリプトからいじろうとして丸一日潰れた話
 http://dnasoftwares.hatenablog.com/entry/2015/03/19/100108

また、シェーダを変形するにあたってスクリプト内でスリープをかけるということをしました。
Unityのスクリプト内でスリープ処理を行う場合、下記のような手段を用いる必要があるようです。
(きちんとは理解できておらず、理屈は説明できません。備忘録として残しておきます)
・WaitForSeconds
 https://docs.unity3d.com/jp/540/ScriptReference/WaitForSeconds.html

以下のようなコードを実装しました。0.05f秒ごとにシェーダのプロパティを変更しています。

IEnumerator Effect()
{
    float attval = 0.0f;
    for (int loop = 0; loop < 20; loop++)
    {
        attval = attval + 0.05f;
        renderer.material.SetFloat("_Destruction", attval);
        renderer.material.SetFloat("_PositionFactor", attval);
        renderer.material.SetFloat("_RotationFactor", attval);
        yield return new WaitForSeconds(0.05f);
    }
}