You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.2 KiB
217 lines
6.2 KiB
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; |
|
} |
|
} |
|
}
|
|
|