3Dオブジェクトを光らせるStandardのEMISSIONが効かないときの対処法

f:id:snoopopo:20210327110432p:plain

StandardのEMISSION

3Dオブジェクトを光らせる方法の1つに、ビルドインシェーダのStandardシェーダのEMISSIONを使う方法がある。 f:id:snoopopo:20210327110711p:plain

スクリプトからStandardのEMISSIONを切り替える方法

   public void SetEmission(bool emission, Color color)
    {
        r = box.GetComponent<MeshRenderer>();

        if (emission)
        {
            r.material.EnableKeyword("_EMISSION");
            r.material.SetColor("_EmissionColor", color);
        } else
        {
            r.material.DisableKeyword("_EMISSION");
        }
    }

上記のように、
一度EnableKeywordで「EMISSION」を有効にする必要にしてから、色を設定する。
EMISSION」を有効にしないと、いくら色をセットしても変わらないので注意!

エディタでは効くのに、android実機で効いていない場合

最初はEMISSIONを無効にしておいて、あとからスクリプトで有効にしたい場合に発生した。 対処方法は、Resouces側に、もともとEMISSIONを有効にしたマテリアルを配置しておくことで対処できる。

f:id:snoopopo:20210327111438p:plain

これは、EMISSION無効状態のマテリアルしかプロジェクトに存在しないと、無効状態のシェーダーしかビルドされないため発生する。
予め有効状態のマテリアルをプロジェクト内に配置すればビルド時に有効状態のシャーダも一緒にビルドされることになるので、問題を解決できる!

参考

kan-kikuchi.hatenablog.com

【Unity】2Dのコライダー

動く物体

f:id:snoopopo:20210319115211p:plain

Is Trigger にチェックが必要
Rigidbody 2Dコンポーネントをつける必要がある
 →Body Typeは物理演算を使いたいならDynamic。物理演算の影響をうけたくない場合はKinematicでよい。

動かない物体

f:id:snoopopo:20210319115221p:plain

Is Trigger にチェックは不要
Rigidbody 2Dコンポーネントも不要

衝突したときに呼ばれるメソッド

2D用のコライダーをつけている場合、OnTriggerEnterではなくOnTriggerEnter2Dなので注意!
また、引数もColliderではなく、Collider2D となっている。
OnTriggerEnterをいくら定義しててもよばれなかったよ…

   private void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("ぶつかった");
    }

    void OnTriggerStay2D(Collider2D collider)
    {
        Debug.Log("ぶつかってる");
    }

    void OnTriggerExit2D(Collider2D other)
    {
        Debug.Log("ぶつかり終わった");
    }

また、上記メソッドは、衝突し合っている物体どちらのメソッドも呼ばれる。

unityで2Dゲーム作るときにはじめにする設定(CameraとかCanvasとか)

設定したい内容

画像1dot分=座標1 transform#positionの1になるようにする

sprite の設定

f:id:snoopopo:20210319111453p:plain

Pixcels per Unit を 1にする。
MeshTypeFullRectにする。
 →これはSpriteAtlas化したときにごみができたり、画像の向きが勝手に変わってパッキングされてしまうのを防ぐため。

Camera

f:id:snoopopo:20210319110752p:plain

ProjectionOthographic にし、Sizeは基準にしている画面サイズ*1縦の半分にする。

Canvas

f:id:snoopopo:20210324122404p:plain

UI ScaleModeScale with Screen Size にし、
 Reference Resolution に基準にしている画面サイズ*2を設定する
  →この設定で、画面サイズが異なっていても、アスペクト比が同じなら同じように表示されるように自動でスケーリングしてくれる。
 Matchで横幅あわせか縦あわせかを設定することで、アスペクト比が異なる端末にも対応できる。
Render ModeScreen Space Overlay にする。
 →これは常にUIを一番手前にもってくるため

*1:キャプチャでは、320x568にしているので、縦の半分の284になっている

*2:キャプチャでは、320x568にしてる

androidでinpufFieldの文字色が白い時の対処法

入力した文字や「OK」が白くて見にくい…

uguiやtextMeshProのinputFieldを使用した際に、
android実機で入力した文字や「OK」が、白くかなり見にくいという現象になりました。 f:id:snoopopo:20201224111528p:plain
▲かなり見にくいけど、赤線引いたところにうっすら入力した文字が出ています。
これを修正する方法をこの記事では書きます。

【この記事を書いたときの環境】
* Unity 2019.1.0f2 Personal(64bit)

対処法

AndroidManifest.xmlandroid:theme="@style/UnityThemeSelector"の内容を追加する。
追加する箇所はここ↓

 <application
        android:allowBackup="true"
        android:theme="@style/UnityThemeSelector" 
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">

▼ビルドしなおして、確認すると黒文字になります! f:id:snoopopo:20201224111304p:plain

【Unity-Shader】#12 Unity道場「Shader Graph はじめてみよう」の表現目指してshader書いた。

今までやってきたいくつかのエフェクト組み合わせた :)

f:id:snoopopo:20200915151210g:plain


youtu.be

最近の記事は↑のShader Graphの動画の内容をコードで書いてみよう!ってことでやってました。

shader

Shader "Custom/Warp"
{
    Properties
    {
        _MainTex("MainTexture", 2D) = "white" {}
        _NoiseTex("NoiseTexture", 2D) = "white" {}
        _PerlinNoiseTex("PerlinNoiseTexture", 2D) = "white" {}
        [HDR] _Color("Color", Color) = (1, 1, 1)
        _ColorVolume("ColorVolume", Range(0,1)) = 0
        _Border("Border", Range(0,1)) = 0
    }

    SubShader
    {
        Cull Off
        AlphaToMask On

        Tags
        {
            "Queue" = "AlphaTest"
            "RenderType" = "AlphaTest"
        }

        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD;
            };

            sampler2D _MainTex;
            sampler2D _PerlinNoiseTex;
            sampler2D _NoiseTex;
            float4 _Color;
            float _ColorVolume;
            float _Border;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {

                {//ブレるような動き
                    fixed2 noiseUv = fixed2(i.uv.x + cos(_Time.y * 0.5), i.uv.y);
                    fixed4 noiseColor = tex2D(_PerlinNoiseTex, noiseUv) * 0.05;

                    i.uv.x += noiseColor.r;
                }

                fixed4 color = tex2D(_MainTex, i.uv); //最終的に出力する色

                {//カラーの変更
                    fixed gray = dot(color.rgb, fixed3(0.299, 0.587, 0.114));
                    fixed4 targetColor = _Color * gray;

                    fixed4 lerpColor = lerp(color, targetColor, _ColorVolume);
                    color = fixed4(lerpColor.r, lerpColor.g, lerpColor.b, tex2D(_MainTex, i.uv).a);
                }


                {//帯電

                    fixed2 noiseUv1 = fixed2(i.uv.x + _Time.y * 1.2, i.uv.y);
                    fixed4 noise1 = tex2D(_NoiseTex, noiseUv1 * 0.005); //画像を拡大

                    fixed2 noiseUv2 = fixed2(i.uv.x + _Time.y * -1.5, i.uv.y);
                    fixed4 noise2 = tex2D(_NoiseTex, noiseUv2 * 0.005); //画像を拡大

                    fixed4 noise = noise1 + noise2;

                    noise = noise * 10 - 15; //remap 0~2の範囲を -5~5の範囲にremap
                    noise = abs(noise); //絶対値をとり、マイナス値だったものプラスに変化 0~5の値に変換
                    noise = 1 - noise; //黒白を反転させる -4~1の値に
                    noise = saturate(noise); //-4~1だとで加算したときに変な値になるので 0~1に絞る clamp01と同じ

                    color += noise; //帯電と元の画像を加算
                }

                {//scanline
                    color *= (1 - step(0.8, sin((i.uv.y - _Time.y * 0.2) * 50)));
                }

                {//border
                    color *= 1 - (step(_Border, i.uv.y));
                    fixed borderSize = 0.05;
                    fixed4 borderLine = (step(_Border, i.uv.y + borderSize) * step(i.uv.y + borderSize, _Border + borderSize)) *_Color;
                    borderLine.a = color.a;
                    color += borderLine;
                }

                if (color.a <= 0) {
                    discard;
                }

                return color;
            }

            ENDCG
        }
    }
}

これまでの記事

それぞれの動作は以下の記事に個別で作ったものがあります!

・色を変える www.snoopopo.com


・直線(スキャンラインwww.snoopopo.com


・上下で消えたり表示したりするやつ(ボーダーライン) www.snoopopo.com


・ぶらぶら歪み www.snoopopo.com


・雷 www.snoopopo.com

なんか今思ってること

今みると見本と違うところあるけど、それがなんなのかわからんw
なんかもっと光がぼわ~としているような? 
あともっとスキャンラインの間隔短いか? ボーダーラインが頭のちょっと上に残ってしまってるな? 

とかとかあるけど

shader 勉強としてやったので課題としてよかった^^ 
なんか知識も足りてないと思うけど手を動かす量がもっと足りてないと思っているので、
shaderのいい問題集・課題集? 的なものがあったら教えてくださいー :D~♪

【Unity-Shader】#11 ノイズ画像を使って雷っぽい表現

ノイズ画像をつかって雷っぽい表現を作った

f:id:snoopopo:20200914133303g:plain


youtu.be

今回はこの動画を元にしています。shader Graph の解説動画なので、これをshaderのコードにしたかんじ。

使った画像

【電撃走らせたい画像】
f:id:snoopopo:20200911112928p:plain

【ノイズ画像】
f:id:snoopopo:20200914134235p:plain

こちらより素材をおかりしました:https://ai-catcher.com/

shader

今回は前回の記事*1からフラグメントシェーダしか触っていないので、 フラグメントシェーダのみ抜粋

fixed4 frag(v2f i) : SV_Target
{
    fixed2 noiseUv1 = fixed2(i.uv.x + _Time.y * 1.2, i.uv.y);
    fixed4 noise1 = tex2D(_NoiseTex, noiseUv1 * 0.005); //画像を拡大

    fixed2 noiseUv2 = fixed2(i.uv.x + _Time.y * -1.5, i.uv.y);
    fixed4 noise2 = tex2D(_NoiseTex, noiseUv2 * 0.005); //画像を拡大

    fixed4 noise = noise1 + noise2;

    //noise = noise * 10 - 5; //remap 0~1の範囲を -5~5の範囲にremap
    noise = noise * 10 - 15; //remap 0~2の範囲を -5~5の範囲にremap
    noise = abs(noise); //絶対値をとり、マイナス値だったものプラスに変化 0~5の値に変換
    noise = 1 - noise; //黒白を反転させる -4~1の値に
    noise = saturate(noise); //-4~1だとで加算したときに変な値になるので 0~1に絞る clamp01と同じ

    fixed4 color = tex2D(_MainTex, i.uv) + noise; //帯電と元の画像を加算

    if (color.a <= 0) {
        discard;
    }

    return color;
}