当模型被建筑物遮挡的时候,如果要将建筑物设为半透明时可以这样处理:
一、检测是否有遮挡物
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 OffBlend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment fragsampler2D _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}}
}
本文发布于:2024-02-01 22:16:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170679697839778.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |