LoginSignup
45

More than 3 years have passed since last update.

壁の後ろにいるオブジェクトを表示する

Last updated at Posted at 2015-06-08

[追記]Unity201x標準の Standard Shader に対応しました

ゲームなどで、プレイヤーが障害物に隠れてカメラから見えないとき、
プレイヤーがどこにいるかわかるように表示してあげると親切です。
2015-06-08_234227.png

まず、オブジェクトの後ろにあるときだけ表示するシェーダーを用意します。

[追記] Standard Shader(Surface shader)を使用している場合はこちらを使います

SurfaceHideOnlyShader.shader
Shader "Custom/SurfaceHideOnlyShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" }
        LOD 200
        ZTest Greater
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows alpha:fade

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

[以前のレガシーなシェーダー(Unlitなど)を使用している場合はこちら]

HideOnlyShader.shader
Shader "Unlit/UnlitTextColorBackShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [HDR] _Color ("Color", Color) = (1,1,1,1)
    }

    CGINCLUDE
        #include "UnityCG.cginc"
        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
            UNITY_FOG_COORDS(1)
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;
        float4 _Color;

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

        fixed4 frag (v2f i) : SV_Target
        {
            // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv)*_Color;
            // apply fog
            UNITY_APPLY_FOG(i.fogCoord, col);
            return col;
        }
    ENDCG

    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+10" }
        LOD 100

        Pass
        {
        CULL Back
        ZWrite Off
        ZTest Greater
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            ENDCG
        }
    }
}

"Queue"="Geometry+10"
不透明オブジェクトを描画した後で

ZTest Greater
隠れているところだけ描画します

2015-06-08_234501.png

MeshRendererのマテリアルサイズを2にして、
普通のシェーダーと隠れたところ用シェーダーを入れます。
2015-06-08_235747.png

できあがりです。
2015-06-08_234227.png

Standard Shader版
スクリーンショット 2020-04-23 20.24.00.png

Universal RP版はこちら

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45