如何为GameObject创建遮罩使其不超出边界显示且支持动态砖块?
Unity GameObject 区域遮罩实现方案
以下方案均支持砖块动态增减,兼容默认Renderer:
方案1:2D场景首选 Sprite Mask
无代码实现,性能开销极低,适合2D精灵类砖块:
- 新建空物体命名为遮罩区域,添加
Sprite Mask组件 - 在组件的
Sprite字段选择和需求边界形状匹配的Sprite,调整缩放至目标边界大小 - 选中所有砖块的预制件,将
Sprite Renderer组件的Mask Interaction属性设置为Visible Inside Mask - 动态新增砖块时,只要预制件已配置好上述属性,新增后自动适配遮罩规则
方案2:全场景通用 模板缓冲(Stencil Buffer)
兼容2D/3D、所有渲染管线,支持任意形状的自定义边界:
- 首先创建遮罩区域用的Shader,仅写模板缓冲不输出颜色,代码如下:
Shader "Custom/StencilMask" { SubShader { Tags { "Queue"="Geometry-100" } Pass { ColorMask 0 ZWrite Off Stencil { Ref 1 Comp Always Pass Replace } } } }
- 新建和边界形状一致的物体(矩形可用Quad、自定义形状可用对应网格),挂载上面Shader生成的材质,调整大小位置至目标边界,该物体不会在画面中渲染
- 再创建砖块用的Shader,仅在模板缓冲匹配时渲染,代码如下:
Shader "Custom/StencilRenderObject" { Properties { _MainTex ("基础纹理", 2D) = "white" {} } SubShader { Pass { Stencil { Ref 1 Comp Equal } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } }
- 所有砖块使用上述Shader生成的材质即可,动态新增的砖块只要用该材质就自动适配遮罩规则。
方案3:规则矩形边界 相机裁剪平面
不需要修改任何物体的材质/Shader,仅适合矩形边界场景:
- 给主相机挂载如下脚本,在Inspector面板调整
CullBounds参数至目标边界范围即可:
using UnityEngine; public class RectAreaCull : MonoBehaviour { [Header("遮罩边界范围")] public Bounds CullBounds; void OnPreCull() { // 用自定义边界替换相机默认裁剪平面 Matrix4x4 customMat = Matrix4x4.Ortho( CullBounds.min.x, CullBounds.max.x, CullBounds.min.y, CullBounds.max.y, Camera.main.nearClipPlane, Camera.main.farClipPlane ); Camera.main.cullingMatrix = Camera.main.worldToCameraMatrix * customMat; } void OnDisable() { // 脚本禁用时恢复默认裁剪矩阵 Camera.main.ResetCullingMatrix(); } }
- 动态新增的砖块只要在
CullBounds范围内就会显示,范围外自动裁剪,无需额外配置。
内容的提问来源于stack exchange,提问作者Kuroyuki Hikari
相关产品推荐
相关产品推荐

