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);
}
}
-
功能概述
ModelVisibilityController 脚本用于在模型的屏幕坐标位于 UI 遮罩区域内时显示模型,并在模型离开遮罩区域时隐藏模型。该功能可用于实现模型与 UI 遮罩的交互效果,以提高用户体验。 -
前置条件
在 Unity 项目中,确保有一个 UI Canvas 和 UI 摄像机。
目标模型的 Renderer 组件应在脚本中绑定,以控制其可见性。 -
属性说明
uiMask:类型为 RectTransform,用于指定 UI 遮罩的区域。
uiCamera:类型为 Camera,用于渲染 UI 的摄像机,用于将模型坐标转换为屏幕坐标。
modelRenderers:类型为 Renderer[],用于指定需要控制显示/隐藏的模型渲染组件。 -
使用步骤
在 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 组件包含所有的模型网格。