我试图在一个统一的游戏,一直在玩我的新iPhone X的缺口,我知道,有新的安全边缘,我们现在必须放置UI元素,以确保他们不会被削减的缺口或家庭手势栏。
但是,当我尝试将UI元素放置在屏幕右上角附近时,iPhone X上的位置将与iPhone 7上的位置不同。
例如,如果我将一个UI元素放置在屏幕右侧边缘的左侧35个单元上。在iPhone7上,UI元素将从可用屏幕的顶部向下放置35个单元,而在iPhoneX上,UI元素将总共放置35个单元减去屏幕顶部的屏幕缺口高度(如果缺口为20个单元,则为5个单元)。
下面是我所说的一幅图片:


因此,我的问题是,如何使UI元素35从“可用”屏幕顶部?我想我目前的解决方案的问题是,如果游戏是在没有缺口的手机上运行的,那么在顶部会有一个很大的空白。
发布于 2018-03-24 03:32:48
所以我找到了一个解决方案,不是一个完美的解决方案,但仍然是一个解决方案。我首先检测设备是否为第X代iPhone,如果为真,则将UI元素的y位置设置为Screen.SecurityArea.max.y位置。
我仍然希望看到其他解决办法。
这是我的代码:
if (UnityEngine.iOS.Device.generation == UnityEngine.iOS.DeviceGeneration.iPhoneX)
{
theImage.transform.position = new Vector2(theImage.transform.position.x, Screen.safeArea.max.y);
}发布于 2018-10-25 04:39:32
您可以使用联合的Screen.safeArea方法来获得任何iPhone的通用安全区域。使用此方法创建一个反应性安全区域父面板,然后从安全面板的右上角创建锚定35个像素的子图像。
这将是一个比硬编码的设备更通用的解决方案,因为未来版本的iPhone X ( Xs,Xs Max,XR)和其他有缺口的安卓手机可能没有相同的大小。在景观模式下,它还将考虑到家居指示灯和侧安全区域。
这需要统一2017.2.1+。安全区域面板应该是一个全屏UI面板(Anchor 0,0到1,1;Pivot 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。希望能帮上忙!
https://stackoverflow.com/questions/49459970
复制相似问题