popcorn/Scripts/Extensions/ScreenExtensions.cs

136 lines
5.0 KiB
C#
Raw Normal View History

using UnityEngine;
public enum ScreenRotateState {
Free,
LandscapeOnly,
PortraitOnly
}
public enum SimpleDeviceOrientation {
Unkown,
Portrait,
Landscape,
}
public static class ScreenExtensions {
public static bool IsNarrowScreen(){
float height = Screen.height;
float width = Screen.width;
if(height > width){
return 16.1f / 9.0f < height / width;
}else{
return 16.1f / 9.0f < width / height;
}
}
public static bool HasSafeArea(){
float height = Screen.height;
float width = Screen.width;
if(height > width){
#if UNITY_EDITOR
return Screen.height != (int)GetSafeArea().height;
#else
return Screen.height != (int)Screen.safeArea.height;
#endif
}else{
#if UNITY_EDITOR
return Screen.width != (int)GetSafeArea().width;
#else
return Screen.width != (int)Screen.safeArea.width;
#endif
}
}
public static Rect GetSafeArea(){
#if UNITY_EDITOR
if((Screen.width == 1125 && Screen.height == 2436) ||
(Screen.width == 2436 && Screen.height == 1125)){
var safeArea = Screen.safeArea;
if(safeArea.height > safeArea.width){
safeArea.height = 2202;
safeArea.y = 102;
safeArea.width = 1125;
}else{
safeArea.height = 1062;
safeArea.y = 63;
safeArea.width = 2172;
safeArea.x = 132;
}
return safeArea;
}else{
return Screen.safeArea;
}
#else
return Screen.safeArea;
#endif
}
public static int GetSafeAreaTop(){
var safeArea = GetSafeArea();
return (int)((Screen.height - safeArea.height - safeArea.y) / safeArea.height * 1136.0f);
}
public static int GetSafeAreaBottom(){
var safeArea = GetSafeArea();
return (int)(safeArea.y / safeArea.height * 1136.0f);
}
public static bool IsiPhoneX(){
return (NativeUtils.getWidth() == 1125 && NativeUtils.getHeight() == 2436) // iPhone X XS
|| (NativeUtils.getWidth() == 2436 && NativeUtils.getHeight() == 1125) // iPhone X XS
|| (NativeUtils.getWidth() == 828 && NativeUtils.getHeight() == 1792) // iPhone XR
|| (NativeUtils.getWidth() == 1792 && NativeUtils.getHeight() == 828) // iPhone XR
|| (NativeUtils.getWidth() == 1242 && NativeUtils.getHeight() == 2688) // iPhone XSMax
|| (NativeUtils.getWidth() == 2688 && NativeUtils.getHeight() == 1242); // iPhone XSMax
}
public static void ChangeScreenRotateState(MonoBehaviour behaviour, ScreenRotateState state){
switch(state){
case ScreenRotateState.Free:
Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = true;
Screen.autorotateToPortraitUpsideDown = true;
break;
case ScreenRotateState.LandscapeOnly:
Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
#if UNITY_ANDROID
// Portrait時に自動でLandscapeにならないので強制変更してからの自動化
if(Screen.orientation == ScreenOrientation.Portrait || Screen.orientation == ScreenOrientation.PortraitUpsideDown){
Screen.orientation = ScreenOrientation.LandscapeLeft;
behaviour.CallWaitForOneFrame(() => Screen.orientation = ScreenOrientation.AutoRotation);
}
#endif
break;
case ScreenRotateState.PortraitOnly:
Screen.autorotateToLandscapeLeft = false;
Screen.autorotateToLandscapeRight = false;
Screen.autorotateToPortrait = true;
Screen.autorotateToPortraitUpsideDown = true;
#if UNITY_ANDROID
// Landscape時に自動でPortraitにならないので強制変更してからの自動化
if(Screen.orientation == ScreenOrientation.LandscapeLeft || Screen.orientation == ScreenOrientation.LandscapeRight){
Screen.orientation = ScreenOrientation.Portrait;
behaviour.CallWaitForOneFrame(() => Screen.orientation = ScreenOrientation.AutoRotation);
}
#endif
break;
}
}
public static SimpleDeviceOrientation DeviceOrientationToSimpleDeviceOrientation(DeviceOrientation deviceOrientation){
switch(deviceOrientation){
case DeviceOrientation.Portrait:
case DeviceOrientation.PortraitUpsideDown:
return SimpleDeviceOrientation.Portrait;
case DeviceOrientation.LandscapeLeft:
case DeviceOrientation.LandscapeRight:
return SimpleDeviceOrientation.Landscape;
default:
return Screen.width < Screen.height ? SimpleDeviceOrientation.Portrait : SimpleDeviceOrientation.Landscape;
}
}
}