using System;
using UnityEngine;
using UnityEngine.UI;
namespace OctoCore.UI
{
///
/// UI Manager component for managing canvas scaling.
/// Automatically adjusts canvas scale factor based on screen size.
///
[ExecuteAlways]
public class OctoUIManager : MonoBehaviour
{
///
/// References to UI settings and canvas scaler.
///
[System.Serializable]
public class References
{
public CanvasScaler CanvasScaler;
}
[SerializeField] private bool dontDestroy = true;
[SerializeField] private bool updateInEditor;
[SerializeField] private References references;
private Action onScreenResize;
#if UNITY_EDITOR
private Vector2Int currentScreenSize;
#endif
void Awake()
{
#if UNITY_EDITOR
if (!Application.isPlaying && !updateInEditor) return;
#endif
if (dontDestroy)
DontDestroyOnLoad(this);
if (OctoCore.Instance)
OctoCore.Instance.UI.SubscribeOnScreenResize(onScreenResize = OnScreenResize);
}
void OnEnable()
{
#if UNITY_EDITOR
if (!Application.isPlaying && !updateInEditor) return;
#endif
RescaleCanvas();
}
void Update()
{
#if UNITY_EDITOR
if (!Application.isPlaying && updateInEditor)
RescaleCanvas(new Vector2Int(Screen.width, Screen.height));
#endif
}
void OnDestroy()
{
#if UNITY_EDITOR
if (!Application.isPlaying && !updateInEditor) return;
#endif
if (onScreenResize != null && OctoCore.Instance)
{
OctoCore.Instance.UI.UnsubscribeOnScreenResize(onScreenResize);
onScreenResize = null;
}
}
private void OnScreenResize(Vector2Int screenSize)
{
RescaleCanvas(screenSize);
}
public void RescaleCanvas()
{
if (!OctoCore.Instance || !OctoCore.Instance.Settings) return;
RescaleCanvas(OctoCore.Instance.UI.ScreenSize, OctoCore.Instance.Settings.Ui.ReferenceSize);
}
public void RescaleCanvas(Vector2Int screenSize)
{
if (!OctoCore.Instance || !OctoCore.Instance.Settings) return;
RescaleCanvas(screenSize, OctoCore.Instance.Settings.Ui.ReferenceSize);
}
private void RescaleCanvas(Vector2Int screenSize, Vector2Int referenceSize)
{
if (!references.CanvasScaler) return;
#if UNITY_EDITOR
if (!Application.isPlaying && updateInEditor)
{
if (currentScreenSize == screenSize) return;
currentScreenSize = screenSize;
}
#endif
float scaleFactor = Mathf.Min((float)screenSize.x / referenceSize.x, (float)screenSize.y / referenceSize.y);
if (scaleFactor == 0) return;
references.CanvasScaler.scaleFactor = scaleFactor;
if (OctoCore.Instance && OctoCore.Instance.Development.Log)
Debug.Log($"Canvas scale factor updated: {scaleFactor}");
}
}
}