/****************************************************
文件:FixScreenRatio.cs
作者:陶长春
邮箱:376248129@qq.com
日期:2025年3月13日 9:10:37
UnityVersion: 2021.3.13f1
功能:UI适配
*****************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using TFramework;
using UnityEngine;
using UnityEngine.UI;
namespace TFramework
{
public class FixScreenRatio : MonoBehaviour
{
public enum Orientation
{
Portrait,
Landscape
}
public float defaultModifier = 0.5f;
public Vector2 currentRes = new Vector2();
public Vector2 newRes = new Vector2();
public float refWidth = 480;
public float refHeight = 320;
public Orientation refOrientation = Orientation.Portrait;
void OnEnable()
{
// Initially update scale
newRes.x = Screen.width;
newRes.y = Screen.height;
UpdateScaling();
}
void Update()
{
// Update if resolution has changed
newRes.x = Screen.width;
newRes.y = Screen.height;
if (newRes != currentRes)
{
UpdateScaling();
}
}
private void OnValidate()
{
UpdateScaling();
}
///
/// Handles updating of the canvas scale based on device resolution
///
public virtual void UpdateScaling()
{
currentRes = newRes;
// Determine platform specific resolution multiplier
float multiplier = 1f;
#if UNITY_ANDROID || UNITY_IOS
switch (refOrientation)
{
case Orientation.Portrait:
multiplier = 1f + ((((float)currentRes.y - refHeight) / refHeight) * defaultModifier);
break;
case Orientation.Landscape:
multiplier = 1f + ((((float)currentRes.x - refWidth) / refWidth) * defaultModifier);
break;
}
#else
// For desktop platforms we scale based on the largest value out of width & height
if (currentRes.x > currentRes.y)
{
multiplier = 1f + ((((float)currentRes.y - refHeight) / refHeight) * defaultModifier);
}
else
{
multiplier = 1f + ((((float)currentRes.x - refWidth) / refWidth) * defaultModifier);
}
#endif
// Modify multiplier based on initial value.
if (multiplier < 0.5f) // Ceil to 0.5 if less than 0.5
{
multiplier = 0.5f;
}
else if (multiplier < 2f) // Calc to the nearest 0.5 if less than 2
{
multiplier = Mathf.Max(1f, (float)(Math.Round(((double)multiplier * 2), MidpointRounding.AwayFromZero) / 2));
}
else // Otherwise if larger than 2 then round
{
multiplier = (float)Math.Round(multiplier, MidpointRounding.AwayFromZero);
}
// Apply new scale factor to canvas
GetComponent().scaleFactor = multiplier;
}
}
}