更新
- 2019/09/12 增加扩展链接
- 2019/06/30 初次发布
介绍
有时需要将相机视口大小调整为 UI 控件的大小与位置,将 3D 模型显示在 UI 所在的区域。
实现起来很简单,只要将 UI 控件的大小与位置由 UI 坐标转换为屏幕坐标,然后设置相机的视口属性即可。
如果需要在不改变 UI 区域大小的同时实现将显示区域扩展到全屏,可以参考:
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
using UnityEngine;
public static class RectTransformToViewport
{
public static Rect Convert(RectTransform rectTransform, Camera camera)
{
var corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
var bottomLeft = camera.WorldToViewportPoint(corners[0]);
var topLeft = camera.WorldToViewportPoint(corners[1]);
var topRight = camera.WorldToViewportPoint(corners[2]);
var bottomRight = camera.WorldToViewportPoint(corners[3]);
var rect = new Rect();
rect.x = Mathf.Clamp01(bottomLeft.x);
rect.y = Mathf.Clamp01(bottomLeft.y);
rect.width = Mathf.Clamp01(topRight.x - topLeft.x);
rect.height = Mathf.Clamp01(topRight.y - bottomRight.y);
return rect;
}
}
|
注意事项
UGUI 的控件(如 ScrollView)大小与位置更新也在 Update 事件中,因此不能依赖于不同脚本的 Update 事件顺序设置大小与位置,否则有时会出现大小与位置不正确。
有两种解决方法:
- 调用
RectTransform.ForceUpdateRectTransforms,强制刷新 UI
- 使用协程等方法延迟一帧显示,要求 UI 上也必须配合将内容隐藏,下一帧再显示。