我试图团结一致,一直在玩我的新iPhone X.我明白有新的安全边缘,我们现在必须放置UI元素,以确保它们不是被缺口或家庭手势栏裁掉。
然而,当我尝试在屏幕右上角附近放置一个UI元素时,iPhone X上的位置看起来会有所不同,然后在iPhone 7上。
例如,如果我将一个UI元素放置在屏幕右边缘的左下方35个单位。在iPhone7上,UI元素将从可用屏幕的顶部向下放置35个单位,而在iPhoneX上,UI元素将放置总共35个单位减去可用屏幕顶部的屏幕凹陷高度(假设为5)单位,如果缺口是20个单位)
所以我的问题是,我如何从"可用"的顶部制作UI元素35。屏幕?我想当前的解决方案存在的问题是如果游戏是在没有缺口的手机上运行的话,那么顶部会有一个很大的空白区域。
答案 0 :(得分:3)
所以我找到了解决方案,不是一个完美的解决方案,但仍然是一个解决方案我首先检测设备是否是X一代iPhone,如果这是真的,请将UI元素的y位置设置为Screen.safeArea.max.y位置。
我仍然希望看到其他解决方案。
这是我的代码:
if (UnityEngine.iOS.Device.generation == UnityEngine.iOS.DeviceGeneration.iPhoneX)
{
theImage.transform.position = new Vector2(theImage.transform.position.x, Screen.safeArea.max.y);
}
答案 1 :(得分:1)
您可以使用Unity的Screen.safeArea方法获取任何iPhone的常规安全区域。使用它来创建反应性安全区域父面板,然后创建从安全面板右上角锚定35像素的子图像。
这将是比对设备进行硬编码更为通用的解决方案,因为将来的iPhone X(Xs,Xs Max,XR)和其他带有缺口的Android手机可能没有相同大小的缺口。在横向模式下,它还将考虑“归位”指示器和侧面安全区域。
这需要Unity 2017.2.1+。安全区域面板应为全屏UI面板(锚定0,0到1,1;枢轴0.5,0.5)。还建议您将“画布”设置为“与屏幕尺寸成比例”并且“匹配(宽度-高度)” = 0.5,以匹配任何屏幕尺寸和方向。
您可以将此脚本用于安全区域父面板:
public class SafeArea : MonoBehaviour
{
RectTransform Panel;
Rect LastSafeArea = new Rect (0, 0, 0, 0);
void Awake ()
{
Panel = GetComponent<RectTransform> ();
Refresh ();
}
void Update ()
{
Refresh ();
}
void Refresh ()
{
Rect safeArea = GetSafeArea ();
if (safeArea != LastSafeArea)
ApplySafeArea (safeArea);
}
Rect GetSafeArea ()
{
return Screen.safeArea;
}
void ApplySafeArea (Rect r)
{
LastSafeArea = r;
Vector2 anchorMin = r.position;
Vector2 anchorMax = r.position + r.size;
anchorMin.x /= Screen.width;
anchorMin.y /= Screen.height;
anchorMax.x /= Screen.width;
anchorMax.y /= Screen.height;
Panel.anchorMin = anchorMin;
Panel.anchorMax = anchorMax;
}
}
有关更深入的细分,我在https://connect.unity.com/p/updating-your-gui-for-the-iphone-x-and-other-notched-devices处写了详细的截图。希望对您有帮助!