Car/Assets/StompyRobot/SRDebugger/Scripts/UI/Other/SafeAreaSizer.cs

154 lines
3.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace SRDebugger.UI.Other
{
/// <summary>
///
/// </summary>
[RequireComponent(typeof(RectTransform))]
[ExecuteInEditMode]
public class SafeAreaSizer : UIBehaviour, ILayoutElement
{
public RectTransform.Edge Edge
{
get { return _edge; }
set
{
if (_edge != value)
{
_edge = value;
LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
}
}
}
[SerializeField, FormerlySerializedAs("Edge")]
private RectTransform.Edge _edge;
public float Scale = 1f;
private float _height;
private float _width;
public float preferredWidth
{
get
{
return _width;
}
}
public float preferredHeight
{
get
{
return _height;
}
}
public float minWidth
{
get
{
return _width;
}
}
public float minHeight
{
get
{
return _height;
}
}
public int layoutPriority
{
get { return 2; }
}
public float flexibleHeight
{
get { return -1; }
}
public float flexibleWidth
{
get { return -1; }
}
#if UNITY_EDITOR
protected override void OnValidate()
{
base.OnValidate();
if (Application.isPlaying)
{
Refresh();
}
}
void Update()
{
_width = _height = 0;
}
#endif
void Refresh()
{
// Determine the distance in local coords
Rect safeArea = Screen.safeArea;
Canvas myCanvas = GetComponentInParent<Canvas>();
if (myCanvas == null)
{
return;
}
RectTransform canvasRect = myCanvas.GetComponent<RectTransform>();
// RectTransformUtility.PixelAdjustRect()
_width = _height = 0;
switch (_edge)
{
case RectTransform.Edge.Left:
_width = (safeArea.x / myCanvas.pixelRect.width) * canvasRect.rect.width;
break;
case RectTransform.Edge.Right:
_width = (Screen.width - safeArea.width - safeArea.x) / myCanvas.pixelRect.width * canvasRect.rect.width;
break;
case RectTransform.Edge.Top:
_height = (Screen.height - safeArea.height - safeArea.y) / myCanvas.pixelRect.height * canvasRect.rect.height;
break;
case RectTransform.Edge.Bottom:
_height = (safeArea.y / myCanvas.pixelRect.height) * canvasRect.rect.height;
break;
default:
throw new ArgumentOutOfRangeException();
}
_width *= Scale;
_height *= Scale;
}
public void CalculateLayoutInputHorizontal()
{
if (Application.isPlaying)
{
Refresh();
}
}
public void CalculateLayoutInputVertical()
{
if (Application.isPlaying)
{
Refresh();
}
}
}
}