136 lines
5.0 KiB
C#
136 lines
5.0 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|