rabidus-test/Assets/Plugins/QFSW/Quantum Console/Source/Scripts/UI/DynamicCanvasScaler.cs

72 lines
2.1 KiB
C#

using UnityEngine;
using UnityEngine.UI;
namespace QFSW.QC.UI
{
[ExecuteInEditMode]
public class DynamicCanvasScaler : MonoBehaviour
{
public float RectMagnification
{
get => _rectMagnification;
set
{
if (value > 0)
{
_rectMagnification = value;
}
}
}
[Range(0.5f, 2f)]
[SerializeField] private float _rectMagnification = 1f;
public float ZoomMagnification
{
get => _zoomMagnification;
set
{
if (value > 0)
{
_zoomMagnification = value;
}
}
}
[Range(0.5f, 2f)]
[SerializeField] private float _zoomMagnification = 1f;
[SerializeField] private CanvasScaler _scaler = null;
[SerializeField] private RectTransform _uiRoot = null;
[SerializeField] private Vector2 _referenceResolution = new Vector2(1920, 1080);
private float RootScaler => _rectMagnification / _zoomMagnification;
private float _lastScaler;
private void OnEnable()
{
_lastScaler = RootScaler;
}
private void Update()
{
if (_scaler && _uiRoot)
{
if (RootScaler != _lastScaler)
{
Rect rootRect = new Rect(_uiRoot.offsetMin.x / _lastScaler, _uiRoot.offsetMin.y / _lastScaler, _uiRoot.offsetMax.x / _lastScaler, _uiRoot.offsetMax.y / _lastScaler);
_lastScaler = RootScaler;
_scaler.referenceResolution = _referenceResolution / _zoomMagnification;
_uiRoot.offsetMin = new Vector2(rootRect.x, rootRect.y) * RootScaler;
_uiRoot.offsetMax = new Vector2(rootRect.width, rootRect.height) * RootScaler;
#if UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(_uiRoot);
UnityEditor.EditorUtility.SetDirty(_scaler);
#endif
}
}
}
}
}