Làm thế nào tôi có thể làm mờ nhân vật người chơi khi anh ta đi vào bên trong hoặc bên ngoài khu vực?


17

Tôi muốn làm mờ dần cầu thủ khi anh ta ra khỏi khu vực.

Ví dụ, giả sử một người đi vào một tòa nhà. Khi một người ở bên ngoài tòa nhà, anh ta không nên được nhìn thấy, nhưng khi anh ta bước vào, anh ta dần dần nhìn thấy (sử dụng hiệu ứng mờ dần).

Khi voi ở trong vùng màu xanh lá cây, alpha của nó phải là 1

ảnh_2019-04-15_07-21-39

Khi voi ở ngoài vùng màu xanh lá cây, alpha của nó phải là 0

ảnh_2019-04-15_07-21-35

Câu trả lời:


34

Bạn có thể sử dụng không gian thế giới để làm mờ dần nhân vật của bạn.

Không gian đối tượng (hoặc hệ tọa độ đối tượng) dành riêng cho từng đối tượng trò chơi; tuy nhiên, tất cả các đối tượng trò chơi được chuyển thành một hệ tọa độ chung - không gian thế giới.

Nếu một đối tượng trò chơi được đưa trực tiếp vào không gian thế giới, phép biến đổi đối tượng thành thế giới được chỉ định bởi thành phần Biến đổi của đối tượng trò chơi.

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

Làm mờ dần bởi không gian thế giới

Bản ghi_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 bề mặt

Sau khi hiểu không gian thế giới, chúng ta có thể sử dụng nó trong shader bề mặt của chúng ta:

Bản ghi_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"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.