Wie kann ich einen Spielercharakter ausblenden, wenn er sich innerhalb oder außerhalb des Bereichs befindet?

17

Ich möchte den Spieler ausblenden, wenn er den Bereich verlässt.

Angenommen, eine Person betritt ein Gebäude. Wenn sich eine Person außerhalb des Gebäudes befindet, sollte sie nicht gesehen werden, aber wenn sie das Gebäude betritt, wird sie nach und nach sichtbar (mithilfe des Fading-Effekts).

Wenn sich der Elefant im grünen Bereich befindet, sollte sein Alpha 1 sein

photo_2019-04-15_07-21-39

Wenn sich der Elefant außerhalb des grünen Bereichs befindet, sollte sein Alpha 0 sein

photo_2019-04-15_07-21-35

Seyed Morteza Kamali
quelle

Antworten:

34

Sie können den Weltraum nutzen, um Ihren Charakter zu verblassen.

Der Objektraum (oder das Objektkoordinatensystem) ist für jedes Spielobjekt spezifisch. Alle Spielobjekte werden jedoch in ein gemeinsames Koordinatensystem umgewandelt - den Weltraum.

Wenn ein Spielobjekt direkt in den Weltraum gestellt wird, wird die Objekt-zu-Welt-Transformation durch die Transformationskomponente des Spielobjekts angegeben.

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

Verblassen im Weltraum

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

Oberflächen-Shader

Nachdem wir den Weltraum verstanden haben, können wir ihn in unserem Surface Shader verwenden:

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
quelle