¿Cómo puedo desvanecer el personaje del jugador cuando entra o sale del área?

17

Quiero desvanecer al jugador cuando sale del área.

Por ejemplo, supongamos que una persona ingresa a un edificio. Cuando una persona está fuera del edificio, no debe verse, pero cuando ingresa se hace visible gradualmente (usando el efecto de desvanecimiento).

cuando el elefante está dentro del área verde, su alfa debería ser 1

photo_2019-04-15_07-21-39

cuando el elefante está fuera del área verde, su alfa debería ser 0

photo_2019-04-15_07-21-35

Seyed Morteza Kamali
fuente

Respuestas:

34

Puedes usar el espacio mundial para desvanecer a tu personaje.

El espacio del objeto (o sistema de coordenadas del objeto) es específico para cada objeto del juego; sin embargo, todos los objetos del juego se transforman en un sistema de coordenadas común: el espacio mundial.

Si un objeto de juego se coloca directamente en el espacio mundial, la transformación de objeto a mundo se especifica mediante el componente Transformar del objeto de juego.

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

Desvaneciéndose por el espacio mundial

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  
      }
   }
}

Sombreador de superficie

Después de comprender el espacio mundial, podemos usarlo en nuestro sombreador de superficie:

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
fuente