我想要做相同的事情,但遇到了完全相同的问题。我认为这是一个错误,但成功找到了解决方案。
可以通过锚点、中心点和屏幕大小(Screen.width, Screen.height)或Canvas的大小来实现。在我的情况下,我将使用Canvas的大小。
当你按住
Alt键并单击
RawImage
RectTransform
的拉伸图标时,
RawImage
将以全屏显示。您可以通过以下代码完成相同的操作,同时更改编辑器中更改的值:
rectTrfm.anchoredPosition3D = new Vector3(0, 0, 0);
//Stretch the Image so that the whole screen is totally covered
rectTrfm.anchorMin = new Vector2(0, 0);
rectTrfm.anchorMax = new Vector2(1, 1);
rectTrfm.pivot = new Vector2(0.5f, 0.5f);
rectTrfm.offsetMin = Vector2.zero;
rectTrfm.offsetMax = Vector2.zero;
它可以正常工作并应该为您提供全屏的
RawImage
。问题在于,当旋转角度为
0
和
180
(或者也称为倒置)时,它可以运行。但是当旋转角度为
-90
、
90
和
270
时,它
无法正常工作。这些角度通常是在将
RawImage
向右或向左旋转时得到的。我怀疑这是一个错误。
要解决此问题,您需要从Canvas的
RectTransform
大小计算出纵横比,然后使用它来创建
anchorMin
和
anchorMax
。其余代码应保持不变。
RectTransform canvasRectTrfm = rawImage.canvas.GetComponent<RectTransform>();
float aspRatio = canvasRectTrfm.rect.size.x / canvasRectTrfm.rect.size.y;
float halfAspRatio = aspRatio / 2.0f;
float halfAspRatioInvert = (1.0f / aspRatio) / 2.0f;
rectTrfm.anchorMin = new Vector2(0.5f - halfAspRatioInvert, 0.5f - halfAspRatio);
rectTrfm.anchorMax = new Vector2(0.5f + halfAspRatioInvert, 0.5f + halfAspRatio);
rectTrfm.anchoredPosition3D = Vector3.zero;
rectTrfm.pivot = new Vector2(0.5f, 0.5f);
rectTrfm.offsetMin = Vector2.zero;
rectTrfm.offsetMax = Vector2.zero;
这应该适用于 -90
,90
和 270
角度,但不适用于 0
和 180
。这不是问题,因为我们的第一个代码适用于 0
和 180
角度。我们可以在运行时检测角度,并根据当前 RawImage
的角度执行代码。
您可以在下面的代码中看到将两个代码组合在一起的完整函数名为 StretchImageFullScreen
。以下是一个示例代码,当按下 Space 键时,在全屏和 RawImage
的原始大小之间切换视频。要退出切换模式,请按下 R 键。使用 RawImageInfo
结构体在切换到全屏之前复制 RectTransform
信息,以便在再次使用 Space 键或按下 R 键时恢复默认位置/旋转。
将以下代码添加到其他回答中的代码中,您应该能够在全屏视频和默认的 RawImage
大小之间切换,并且应该能够使用 StretchImageFullScreen
函数中的第二个参数旋转它。
public struct RawImageInfo
{
public Vector3 anchorPos;
public Vector2 widthAndHeight;
public Vector2 anchorMin;
public Vector2 anchorMax;
public Vector2 pivot;
public Vector2 offsetMin;
public Vector2 offsetMax;
public Quaternion rot;
public Vector3 scale;
}
RawImageInfo originalImgInfo;
bool fullSclreen = false;
void Awake()
{
originalImgInfo = GetImageSettings(image);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
fullSclreen = !fullSclreen;
if (fullSclreen)
StretchImageFullScreen(image, 90);
else
ApplyImageSettings(image, originalImgInfo);
}
if (Input.GetKeyDown(KeyCode.R))
{
ApplyImageSettings(image, originalImgInfo);
fullSclreen = false;
}
}
private void StretchImageFullScreen(RawImage rawImage, int rotAngle = 0)
{
RectTransform rectTrfm = rawImage.rectTransform;
Vector3 rot = rectTrfm.rotation.eulerAngles;
rot.z = rotAngle;
rectTrfm.rotation = Quaternion.Euler(rot);
rot = rectTrfm.rotation.eulerAngles;
if (Mathf.Approximately(rot.z, 0) || Mathf.Approximately(rot.z, 180))
{
rectTrfm.anchoredPosition3D = new Vector3(0, 0, 0);
rectTrfm.anchorMin = new Vector2(0, 0);
rectTrfm.anchorMax = new Vector2(1, 1);
rectTrfm.pivot = new Vector2(0.5f, 0.5f);
rectTrfm.offsetMin = Vector2.zero;
rectTrfm.offsetMax = Vector2.zero;
}
else if (Mathf.Approximately(rot.z, -90) || Mathf.Approximately(rot.z, 90)
|| Mathf.Approximately(rot.z, 270))
{
RectTransform canvasRectTrfm = rawImage.canvas.GetComponent<RectTransform>();
float aspRatio = canvasRectTrfm.rect.size.x / canvasRectTrfm.rect.size.y;
float halfAspRatio = aspRatio / 2.0f;
float halfAspRatioInvert = (1.0f / aspRatio) / 2.0f;
rectTrfm.anchorMin = new Vector2(0.5f - halfAspRatioInvert, 0.5f - halfAspRatio);
rectTrfm.anchorMax = new Vector2(0.5f + halfAspRatioInvert, 0.5f + halfAspRatio);
rectTrfm.anchoredPosition3D = Vector3.zero;
rectTrfm.pivot = new Vector2(0.5f, 0.5f);
rectTrfm.offsetMin = Vector2.zero;
rectTrfm.offsetMax = Vector2.zero;
}
}
RawImageInfo GetImageSettings(RawImage rawImage)
{
RectTransform rectTrfm = rawImage.rectTransform;
RawImageInfo rawImgInfo = new RawImageInfo();
rawImgInfo.anchorPos = rectTrfm.anchoredPosition3D;
rawImgInfo.widthAndHeight = rectTrfm.sizeDelta;
rawImgInfo.anchorMin = rectTrfm.anchorMin;
rawImgInfo.anchorMax = rectTrfm.anchorMax;
rawImgInfo.pivot = rectTrfm.pivot;
rawImgInfo.offsetMin = rectTrfm.offsetMin;
rawImgInfo.offsetMax = rectTrfm.offsetMax;
rawImgInfo.rot = rectTrfm.rotation;
rawImgInfo.scale = rectTrfm.localScale;
return rawImgInfo;
}
private void ApplyImageSettings(RawImage rawImage, RawImageInfo rawImgInfo)
{
RectTransform rectTrfm = rawImage.rectTransform;
rectTrfm.anchoredPosition3D = rawImgInfo.anchorPos;
rectTrfm.sizeDelta = rawImgInfo.widthAndHeight;
rectTrfm.anchorMin = rawImgInfo.anchorMin;
rectTrfm.anchorMax = rawImgInfo.anchorMax;
rectTrfm.pivot = rawImgInfo.pivot;
rectTrfm.offsetMin = rawImgInfo.offsetMin;
rectTrfm.offsetMax = rawImgInfo.offsetMax;
rectTrfm.rotation = rawImgInfo.rot;
rectTrfm.localScale = rawImgInfo.scale;
}