默认情况下,如果camera space UI的缩放模式设置为Scale with screen size
,那么无论你怎么修改camera space UI对应的camera的viewport,UI也不会像场景中3D物体一样根据viewport的大小进行缩放。原因在于默认的CanvasScaler
组件的实现,没有将对应camera的viewport考虑进去,而总是采用screen的大小。
protected virtual void HandleScaleWithScreenSize()
{
Vector2 screenSize = new Vector2(Screen.width, Screen.height);
// ...
}
这里我们通过继承CanvasScaler
来实现根据viewport rect进行缩放。
private Canvas m_canvas;
protected override void OnEnable()
{
m_canvas = GetComponent<Canvas>();
base.OnEnable();
}
protected override void HandleScaleWithScreenSize()
{
Vector2 screenSize;
if (m_canvas.renderMode == RenderMode.CameraSpace)
{
screenSize = m_canvas.pixelRect.size;
}
else
{
screeenSize = new Vector2(Screen.width, Screen.height);
}
// ...
}