You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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、所有渲染管线,支持任意形状的自定义边界:

  1. 首先创建遮罩区域用的Shader,仅写模板缓冲不输出颜色,代码如下:
Shader "Custom/StencilMask"
{
    SubShader
    {
        Tags { "Queue"="Geometry-100" }
        Pass
        {
            ColorMask 0
            ZWrite Off
            Stencil
            {
                Ref 1
                Comp Always
                Pass Replace
            }
        }
    }
}
  1. 新建和边界形状一致的物体(矩形可用Quad、自定义形状可用对应网格),挂载上面Shader生成的材质,调整大小位置至目标边界,该物体不会在画面中渲染
  2. 再创建砖块用的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
        }
    }
}
  1. 所有砖块使用上述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:15:04