[Unity] Unlitで影つけて色も変えたいシェーダー

ダメージを受けたら色変えたいなーと。

[Unity] Unlitなシェーダで影付け
ここで作っていたものに、Colorのプロパティを追加!

Project上で、右クリックCreateから、Shaderを何か作ってダブルクリック。以下の内容に置き換えます。

Shader "Unlit/UnlitColorShadow"
{
	Properties
	{
		_Color("Main Color", Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
	}
		SubShader
	{
		Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" }
		LOD 100

		Blend SrcAlpha OneMinusSrcAlpha

		Pass{
			Color[_Color]
			SetTexture[_MainTex]{ combine texture * primary }
		}
		UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
	}
}

PassでColor反映して、「combine texture * primary」乗算してアルファ値を反映。
previousでも同じ結果。

Texture Combiners
https://docs.unity3d.com/ja/current/Manual/SL-SetTexture.html

Tagsは、標準のUnlit Transparentを真似しました。

使っているクエリちゃんモデルの場合、髪以外、全部これでどうにかなります。

髪がうまくいかなかったけど、ZWrite Offで綺麗に描画された。
これはまた別のShaderとして作成して利用しました。

Shader "Unlit/UnlitColorShadow ZWOff"
....
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha
....

ZWrite Offを追記しただけ。

参考
https://docs.unity3d.com/ja/current/Manual/SL-CullAndDepth.html
半透明の効果を描画する場合は ZWrite Off にします。

ただこれだけではうまくいかず、この髪のRender Queueを3001にして期待の描画に。
元々Face用のマテリアルのQueueが2450になっていて、それをいつのまにか3000にしてしまっていたのがダメでした。そのままFaceは2450、髪は3000の場合で問題なかったです。逆に3001以上にすると、他のマテリアルより後にレンダリングされることでそこだけ浮いてしまってダメでした。

外側だから後がいいのかな?

複数利用しているのも、同じマテリアルでいけました。

対象のモデルで複数のマテリアルを使っているので、色を変えるときは、同時に複数のマテリアルの色変更をしないといけない。

    //こんな定義でInspectorから入れ込み
    public Material[] materialsForDamage;

        // ダメージ時に、Update内などでうまいことやる。
        Color col= new Color(1f, 0.7f, 0.7f, trans);
        foreach (Material m in materialsForDamage)
        {
            m.color = col;
        }

最近publicをよく使うのは、VisualStudioでSerialize書くと綺麗にならないから、、。
もう個人プロジェクトはどっちでもいいかなとか、、。(多分よくない)

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする