当模型被建筑物遮挡的时候,如果要将建筑物设为半透明时可以这样处理:
一、检测是否有遮挡物
public class Player : MonoBehaviour
{
List<Material> materials = new List<Material>();
public void Update()
{
UpdateMaterials
}
//检测模型是否被遮挡
private void UpdateMaterials()
{
RaycastHit rh;
if (Physics.Linecast(Camera.main.position, transform.position, out rh, LayerMask.GetMask("Build")))
{
Material material = rh.transform.GetComponentInChildren<MeshRenderer>().materials[0];
if (!materials.Contains(material))
{
materials.Add(material);
}
material.SetFloat("_Alpha", 0.3f);
}
else
{
materials.ForEach((temp) => { temp.SetFloat("_Alpha", 1); });
materials.Clear();
}
}
}
二、设置模型Material的Shader
Shader "Unlit/BuildShader"
{
Properties
{
[NoScaleoffset]_MainTex ("Texture", 2D) = "white" {}
_Alpha("Alpha", Range(0, 1)) = 0.3
}
SubShader
{
Tags { "RenderType"="Opaque" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
float4 _MainTex_ST;
float _Alpha;
struct MeshData
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct Interpolator
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
Interpolator vert (MeshData v)
{
Interpolator o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
float4 frag (Interpolator i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return float4(col.x, col.y, col.z, _Alpha);
}
ENDCG
}
}
}