Unity-UGUI Mask 实现3D物体的遮罩

public class ModelVisibilityController : MonoBehaviour
{
    public RectTransform uiMask;   // UI遮罩的RectTransform
    public Camera uiCamera;        // 用于渲染UI的摄像机
    public Renderer[] modelRenderers; // 需要控制的模型渲染组件

    void Start()
    {
        uiCamera = CameraComponent.Instance.UICamera; // 通过单例模式获取 UI 摄像机实例
    }

    void Update()
    {
        if (modelRenderers == null || modelRenderers.Length == 0) return;

        if (IsModelInsideMask())
        {
            foreach (var renderer in modelRenderers)
            {
                if (renderer != null) renderer.enabled = true;
            }
        }
        else
        {
            foreach (var renderer in modelRenderers)
            {
                if (renderer != null) renderer.enabled = false;
            }
        }
    }

    private bool IsModelInsideMask()
    {
       /* foreach (var renderer in modelRenderers)
        {
            if (renderer == null) continue;

            Bounds bounds = renderer.bounds;
            Vector3[] boundPoints = new Vector3[8];
            boundPoints[0] = bounds.min;
            boundPoints[1] = new Vector3(bounds.min.x, bounds.min.y, bounds.max.z);
            boundPoints[2] = new Vector3(bounds.min.x, bounds.max.y, bounds.min.z);
            boundPoints[3] = new Vector3(bounds.min.x, bounds.max.y, bounds.max.z);
            boundPoints[4] = new Vector3(bounds.max.x, bounds.min.y, bounds.min.z);
            boundPoints[5] = new Vector3(bounds.max.x, bounds.min.y, bounds.max.z);
            boundPoints[6] = new Vector3(bounds.max.x, bounds.max.y, bounds.min.z);
            boundPoints[7] = bounds.max;

            foreach (var point in boundPoints)
            {
                Vector3 screenPoint = uiCamera.WorldToScreenPoint(point);
                if (RectTransformUtility.RectangleContainsScreenPoint(uiMask, screenPoint, uiCamera))
                {
                    return true;
                }
            }
        }
        return false;
        */
         // 获取模型的屏幕坐标
 Vector3 modelScreenPos = uiCamera.WorldToScreenPoint(transform.position);

 // 检查模型的屏幕坐标是否在UI遮罩的范围内
 return RectTransformUtility.RectangleContainsScreenPoint(uiMask, modelScreenPos, uiCamera);
    }
}
  1. 功能概述
    ModelVisibilityController 脚本用于在模型的屏幕坐标位于 UI 遮罩区域内时显示模型,并在模型离开遮罩区域时隐藏模型。该功能可用于实现模型与 UI 遮罩的交互效果,以提高用户体验。

  2. 前置条件
    在 Unity 项目中,确保有一个 UI Canvas 和 UI 摄像机。
    目标模型的 Renderer 组件应在脚本中绑定,以控制其可见性。

  3. 属性说明
    uiMask:类型为 RectTransform,用于指定 UI 遮罩的区域。
    uiCamera:类型为 Camera,用于渲染 UI 的摄像机,用于将模型坐标转换为屏幕坐标。
    modelRenderers:类型为 Renderer[],用于指定需要控制显示/隐藏的模型渲染组件。

  4. 使用步骤
    在 Unity 场景中创建 UI 遮罩:

在 Canvas 中添加一个 UI 元素(如 Image),并调整其大小和位置以作为遮罩区域。
为此 UI 元素添加 RectTransform 组件(默认已存在)。
创建用于渲染 UI 的摄像机:

在 Unity 场景中添加一个 Camera,设置其 Culling Mask 仅渲染 UI 层。
将 uiCamera 指定为该 UI 摄像机。
在模型上添加 ModelVisibilityController 脚本:

将 ModelVisibilityController 脚本添加到模型的根对象或包含模型的 GameObject 上。
设置脚本参数:

将 UI 遮罩的 RectTransform 组件拖拽至 uiMask 字段。
将 UI 摄像机拖拽至 uiCamera 字段。
将目标模型的 Renderer 组件拖拽至 modelRenderers 数组字段中。如果有多个渲染器,可以添加多个。
5. 注意事项
精度问题:IsModelInsideMask() 方法会计算模型的边界 8 个角点,以确保模型的大部分进入遮罩区域时才显示,避免只因模型中心点位于遮罩内而误显示。
性能优化:如果场景中有大量模型,可能需要考虑减少 Update 调用的频率,或仅在遮罩区域移动时进行检查。
6. 常见问题
模型显示不正常:确认 uiCamera 和 uiMask 已正确绑定,确保 modelRenderers 中所有渲染组件均已设置。
遮罩判断不准确:确认 uiCamera 的 Culling Mask 设置为只渲染 UI 层,并确保模型的 Renderer 组件包含所有的模型网格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染-青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值