プレイヤーがエリアから出たときにプレイヤーをフェードアウトさせたい。
たとえば、人が建物に入ったとします。人が建物の外にいるとき、彼は見られるべきではありませんが、彼が入ったとき、彼は徐々に見えます(フェード効果を使用して)。
象が緑のエリア内にいるとき、彼のアルファは1でなければなりません
象が緑のエリアの外にいるとき、彼のアルファは0でなければなりません
プレイヤーがエリアから出たときにプレイヤーをフェードアウトさせたい。
たとえば、人が建物に入ったとします。人が建物の外にいるとき、彼は見られるべきではありませんが、彼が入ったとき、彼は徐々に見えます(フェード効果を使用して)。
象が緑のエリア内にいるとき、彼のアルファは1でなければなりません
象が緑のエリアの外にいるとき、彼のアルファは0でなければなりません
回答:
ワールドスペースを使用してキャラクターをフェードできます。
オブジェクト空間(またはオブジェクト座標系)は、各ゲームオブジェクトに固有です。ただし、すべてのゲームオブジェクトは1つの共通の座標系、つまりワールドスペースに変換されます。
ゲームオブジェクトがワールド空間に直接配置される場合、オブジェクトからワールドへの変換は、ゲームオブジェクトのTransformコンポーネントによって指定されます。
https://en.wikibooks.org/wiki/Cg_Programming/Unity/Shading_in_World_Space
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 "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"
}