需要将RectMask2D的区域传给3d物品显示的Shader,然后控制3d物体的透明度,不在范围内的设置为0
首先修改使用到的Shader,添加(使用到的参数声明忽略):
//Properties _MinX ("Min X", Float) = -10 _MaxX ("Max X", Float) = 10 _MinY ("Min Y", Float) = -10 _MaxY ("Max Y", Float) = 10 //顶点函数 o.wpos = mul(unity_ObjectToWorld, v.vertex).xyz; //片元函数 c.a *= (i.wpos.x >= _MinX ); c.a *= (i.wpos.x <= _MaxX); c.a *= (i.wpos.y >= _MinY); c.a *= (i.wpos.y <= _MaxY); c.rgb *= c.a;
获取RectMask2D的区域,传递需要裁剪的3D物体
Vector3[] corners = new Vector3[4]; RectTransform rectTransform = GetComponent<RectTransform>("UIGirdlView/Viewport"); rectTransform.GetWorldCorners(corners); m_GridCorners[0] = corners[0].x; m_GridCorners[1] = corners[0].y; m_GridCorners[2] = corners[2].x; m_GridCorners[3] = corners[2].y; var items = transform.GetComponentsInChildren<Renderer>(); foreach (var item in items) { var m = item.material; m.SetFloat("_MinX", m_GridCorners[0]); m.SetFloat("_MinY", m_GridCorners[1]); m.SetFloat("_MaxX", m_GridCorners[2]); m.SetFloat("_MaxY", m_GridCorners[3]); }