218 lines
6.2 KiB
C#
218 lines
6.2 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
namespace FairyGUI
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
[ExecuteInEditMode]
|
|||
|
[AddComponentMenu("FairyGUI/UI Content Scaler")]
|
|||
|
public class UIContentScaler : MonoBehaviour
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public enum ScaleMode
|
|||
|
{
|
|||
|
ConstantPixelSize,
|
|||
|
ScaleWithScreenSize,
|
|||
|
ConstantPhysicalSize
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public enum ScreenMatchMode
|
|||
|
{
|
|||
|
MatchWidthOrHeight,
|
|||
|
MatchWidth,
|
|||
|
MatchHeight
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public ScaleMode scaleMode;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public ScreenMatchMode screenMatchMode;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public int designResolutionX;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public int designResolutionY;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public int fallbackScreenDPI = 96;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public int defaultSpriteDPI = 96;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public float constantScaleFactor = 1;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 当false时,计算比例时会考虑designResolutionX/Y的设置是针对横屏还是竖屏。否则不考虑。
|
|||
|
/// </summary>
|
|||
|
public bool ignoreOrientation = false;
|
|||
|
|
|||
|
[System.NonSerialized]
|
|||
|
public static float scaleFactor = 1;
|
|||
|
|
|||
|
[System.NonSerialized]
|
|||
|
public static int scaleLevel = 0;
|
|||
|
|
|||
|
[System.NonSerialized]
|
|||
|
bool _changed;
|
|||
|
|
|||
|
void OnEnable()
|
|||
|
{
|
|||
|
if (Application.isPlaying)
|
|||
|
{
|
|||
|
//播放模式下都是通过Stage自带的UIContentScaler实现调整的,所以这里只是把参数传过去
|
|||
|
UIContentScaler scaler = Stage.inst.gameObject.GetComponent<UIContentScaler>();
|
|||
|
if (scaler != this)
|
|||
|
{
|
|||
|
scaler.scaleMode = scaleMode;
|
|||
|
if (scaleMode == ScaleMode.ScaleWithScreenSize)
|
|||
|
{
|
|||
|
scaler.designResolutionX = designResolutionX;
|
|||
|
scaler.designResolutionY = designResolutionY;
|
|||
|
scaler.screenMatchMode = screenMatchMode;
|
|||
|
scaler.ignoreOrientation = ignoreOrientation;
|
|||
|
}
|
|||
|
else if (scaleMode == ScaleMode.ConstantPhysicalSize)
|
|||
|
{
|
|||
|
scaler.fallbackScreenDPI = fallbackScreenDPI;
|
|||
|
scaler.defaultSpriteDPI = defaultSpriteDPI;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
scaler.constantScaleFactor = constantScaleFactor;
|
|||
|
}
|
|||
|
scaler.ApplyChange();
|
|||
|
GRoot.inst.ApplyContentScaleFactor();
|
|||
|
}
|
|||
|
}
|
|||
|
else //Screen width/height is not reliable in OnEnable in editmode
|
|||
|
_changed = true;
|
|||
|
}
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
if (_changed)
|
|||
|
{
|
|||
|
_changed = false;
|
|||
|
ApplyChange();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void OnDestroy()
|
|||
|
{
|
|||
|
if (!Application.isPlaying)
|
|||
|
{
|
|||
|
scaleFactor = 1;
|
|||
|
scaleLevel = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//For UIContentScalerEditor Only, as the Screen.width/height is not correct in OnInspectorGUI
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public void ApplyModifiedProperties()
|
|||
|
{
|
|||
|
_changed = true;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public void ApplyChange()
|
|||
|
{
|
|||
|
float screenWidth;
|
|||
|
float screenHeight;
|
|||
|
|
|||
|
if (Application.isPlaying) //In case of multi display, we keep using the display which Stage object resides.
|
|||
|
{
|
|||
|
screenWidth = Stage.inst.width;
|
|||
|
screenHeight = Stage.inst.height;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
screenWidth = Screen.width;
|
|||
|
screenHeight = Screen.height;
|
|||
|
}
|
|||
|
if (scaleMode == ScaleMode.ScaleWithScreenSize)
|
|||
|
{
|
|||
|
if (designResolutionX == 0 || designResolutionY == 0)
|
|||
|
return;
|
|||
|
|
|||
|
int dx = designResolutionX;
|
|||
|
int dy = designResolutionY;
|
|||
|
if (!ignoreOrientation && (screenWidth > screenHeight && dx < dy || screenWidth < screenHeight && dx > dy))
|
|||
|
{
|
|||
|
//scale should not change when orientation change
|
|||
|
int tmp = dx;
|
|||
|
dx = dy;
|
|||
|
dy = tmp;
|
|||
|
}
|
|||
|
|
|||
|
if (screenMatchMode == ScreenMatchMode.MatchWidthOrHeight)
|
|||
|
{
|
|||
|
float s1 = (float)screenWidth / dx;
|
|||
|
float s2 = (float)screenHeight / dy;
|
|||
|
scaleFactor = Mathf.Min(s1, s2);
|
|||
|
}
|
|||
|
else if (screenMatchMode == ScreenMatchMode.MatchWidth)
|
|||
|
scaleFactor = (float)screenWidth / dx;
|
|||
|
else
|
|||
|
scaleFactor = (float)screenHeight / dy;
|
|||
|
}
|
|||
|
else if (scaleMode == ScaleMode.ConstantPhysicalSize)
|
|||
|
{
|
|||
|
float dpi = Screen.dpi;
|
|||
|
if (dpi == 0)
|
|||
|
dpi = fallbackScreenDPI;
|
|||
|
if (dpi == 0)
|
|||
|
dpi = 96;
|
|||
|
scaleFactor = dpi / (defaultSpriteDPI == 0 ? 96 : defaultSpriteDPI);
|
|||
|
}
|
|||
|
else
|
|||
|
scaleFactor = constantScaleFactor;
|
|||
|
|
|||
|
if (scaleFactor > 10)
|
|||
|
scaleFactor = 10;
|
|||
|
|
|||
|
UpdateScaleLevel();
|
|||
|
|
|||
|
StageCamera.screenSizeVer++;
|
|||
|
}
|
|||
|
|
|||
|
void UpdateScaleLevel()
|
|||
|
{
|
|||
|
if (scaleFactor > 3)
|
|||
|
scaleLevel = 3; //x4
|
|||
|
else if (scaleFactor > 2)
|
|||
|
scaleLevel = 2; //x3
|
|||
|
else if (scaleFactor > 1)
|
|||
|
scaleLevel = 1; //x2
|
|||
|
else
|
|||
|
scaleLevel = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|