Como posso desvanecer o personagem do jogador quando ele entra ou sai da área?

17

Eu quero desbotar o jogador quando ele sair da área.

Por exemplo, suponha que uma pessoa entre em um edifício. Quando uma pessoa está fora do edifício, ela não deve ser vista, mas quando entra, ela se torna gradualmente visível (usando o efeito de desbotamento).

quando o elefante está dentro da área verde, seu alfa deve ser 1

photo_2019-04-15_07-21-39

quando o elefante está fora da área verde, seu alfa deve ser 0

photo_2019-04-15_07-21-35

Seyed Morteza Kamali
fonte

Respostas:

34

Você pode usar o espaço do mundo para desbotar seu personagem.

O espaço do objeto (ou sistema de coordenadas do objeto) é específico para cada objeto do jogo; no entanto, todos os objetos do jogo são transformados em um sistema de coordenadas comum - o espaço mundial.

Se um objeto de jogo for colocado diretamente no espaço do mundo, a transformação de objeto para mundo será especificada pelo componente Transformar do objeto de jogo.

https://en.wikibooks.org/wiki/Cg_Programming/Unity/Shading_in_World_Space

Desvanecendo-se pelo espaço do mundo

Record_2019_04_15_07_13_25_154

Shader "Smkgames/worldSpaceFade" {
      Properties{
         _Size("Size",Vector) = (2,2,0,0)
      }
   SubShader {
      Pass {
         CGPROGRAM

         #pragma vertex vert  
         #pragma fragment frag 


         struct vertexInput {
            float4 vertex : POSITION;
         };
         struct vertexOutput {
            float4 pos : SV_POSITION;
            float4 position_in_world_space : TEXCOORD0;
         };

         vertexOutput vert(vertexInput input) 
         {
            vertexOutput output; 

            output.pos =  UnityObjectToClipPos(input.vertex);
            output.position_in_world_space = 
               mul(unity_ObjectToWorld, input.vertex);

            return output;
         }
         float2 _Size;

         float4 frag(vertexOutput input) : COLOR 
         {
             float3 world = input.position_in_world_space;

          float4 equation = pow(world.x/_Size.x,8) + pow(world.z/_Size.y,8);
          return smoothstep(1,0,equation);
         }

         ENDCG  
      }
   }
}

Shader de superfície

Depois de entender o espaço do mundo, podemos usá-lo em nosso shader de superfície:

Record_2019_04_15_07_14_24_876

Shader "Smkgames/worldSpaceFade" {
    Properties {
         _Size("Size",Vector) = (2,2,0,0)
        _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 {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
     Pass {
        ZWrite On
        ColorMask 0
    }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows alpha:fade

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
            float3 worldPos: TEXCOORD2;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        float2 _Size;

        void vert (inout appdata_full v, out Input o){
            UNITY_INITIALIZE_OUTPUT(Input,o);
            o.worldPos = mul(unity_ObjectToWorld, v.vertex);
        }


        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            float4 equation = pow(IN.worldPos.x/_Size.x,8) + pow(IN.worldPos.z/_Size.y,8);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = smoothstep(1,0,equation);
        }
        ENDCG
    }
    FallBack "Diffuse"
}
Seyed Morteza Kamali
fonte