Як я можу затухати персонажу гравця, коли він заходить всередину чи поза зоною?


17

Я хочу згасати гравця, коли він виходить із зони.

Наприклад, припустимо, що людина входить до будівлі. Коли людина знаходиться поза будівлею, його не слід бачити, але коли він входить, він поступово стає видимим (використовуючи ефект завмирання).

коли слон знаходиться всередині зеленої зони, його альфа повинен бути 1

фото_2019-04-15_07-21-39

коли слон знаходиться поза зеленою зоною, його альфа повинен бути 0

фото_2019-04-15_07-21-35

Відповіді:


34

Ви можете використовувати світовий простір для згасання свого персонажа.

Простір об'єкта (або система координат об'єкта) є специфічним для кожного ігрового об'єкта; проте всі ігрові об’єкти перетворюються на одну загальну систему координат - світовий простір.

Якщо ігровий об’єкт розміщується безпосередньо у світовому просторі, перетворення об'єкта у світ визначається компонентом Transform ігрового об'єкта.

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

Зникає світовий простір

Запис_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  
      }
   }
}

Поверхневий шейдер

Зрозумівши світовий простір, ми можемо використовувати його в нашому шейдері поверхні:

Запис_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"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.