160 lines
5.5 KiB
C#
160 lines
5.5 KiB
C#
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.Events;
|
|||
|
|
using UnityEngine.UI;
|
|||
|
|
|
|||
|
|
[System.Serializable]
|
|||
|
|
public class ChangeDeviceOrientationEvent : UnityEvent<DeviceOrientation> {}
|
|||
|
|
|
|||
|
|
public class DeviceOrientationChecker : MonoBehaviour {
|
|||
|
|
|
|||
|
|
[SerializeField]
|
|||
|
|
private CanvasScaler[] canvasScalerArray = default;
|
|||
|
|
[SerializeField]
|
|||
|
|
private float[] autoMatchArray = new float[]{ -1.0f, 0.0f };
|
|||
|
|
[SerializeField]
|
|||
|
|
private Camera[] cameraArray = default;
|
|||
|
|
|
|||
|
|
[SerializeField]
|
|||
|
|
private ChangeDeviceOrientationEvent onChangeDeviceOrientation = default;
|
|||
|
|
public ChangeDeviceOrientationEvent OnChangeDeviceOrientation {
|
|||
|
|
get{ return onChangeDeviceOrientation; }
|
|||
|
|
}
|
|||
|
|
[SerializeField]
|
|||
|
|
private ChangeDeviceOrientationEvent onChangeToDeviceOrientationPortrait = default;
|
|||
|
|
public ChangeDeviceOrientationEvent OnChangeToDeviceOrientationPortrait {
|
|||
|
|
get{ return onChangeToDeviceOrientationPortrait; }
|
|||
|
|
}
|
|||
|
|
[SerializeField]
|
|||
|
|
private ChangeDeviceOrientationEvent onChangeToDeviceOrientationLandscape = default;
|
|||
|
|
public ChangeDeviceOrientationEvent OnChangeToDeviceOrientationLandscape {
|
|||
|
|
get{ return onChangeToDeviceOrientationLandscape; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private DeviceOrientation deviceOrientation = DeviceOrientation.Unknown;
|
|||
|
|
public DeviceOrientation DeviceOrientation {
|
|||
|
|
get{ return deviceOrientation; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int screenWidth;
|
|||
|
|
private int screenHeight;
|
|||
|
|
|
|||
|
|
void Start(){
|
|||
|
|
if(ScreenExtensions.IsNarrowScreen() && canvasScalerArray.Length > 0){
|
|||
|
|
for(int i = 0; i < canvasScalerArray.Length; ++i){
|
|||
|
|
if(autoMatchArray[i] < -0.0f){
|
|||
|
|
canvasScalerArray[i].matchWidthOrHeight = (812.0f - 145.0f) / 812.0f;
|
|||
|
|
}else{
|
|||
|
|
canvasScalerArray[i].matchWidthOrHeight = autoMatchArray[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
screenWidth = Screen.width;
|
|||
|
|
screenHeight = Screen.height;
|
|||
|
|
|
|||
|
|
deviceOrientation = GetDeviceOrientation(screenWidth, screenHeight);
|
|||
|
|
InvokeChangeEvent();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Update(){
|
|||
|
|
int currentWidth = Screen.width;
|
|||
|
|
int currentHeight = Screen.height;
|
|||
|
|
DeviceOrientation currentDeviceOrientation = GetDeviceOrientation(currentWidth, currentHeight);
|
|||
|
|
if(deviceOrientation != currentDeviceOrientation || screenWidth != currentWidth || screenHeight != currentHeight){
|
|||
|
|
screenWidth = currentWidth;
|
|||
|
|
screenHeight = currentHeight;
|
|||
|
|
deviceOrientation = currentDeviceOrientation;
|
|||
|
|
InvokeChangeEvent();
|
|||
|
|
#if UNITY_ANDROID
|
|||
|
|
}else{
|
|||
|
|
var currentNativeDeviceOrientation = GetDeviceOrientation(NativeUtils.getWidth(), NativeUtils.getHeight());
|
|||
|
|
if(currentDeviceOrientation != currentNativeDeviceOrientation){
|
|||
|
|
if(currentNativeDeviceOrientation == DeviceOrientation.Portrait || currentNativeDeviceOrientation == DeviceOrientation.PortraitUpsideDown){
|
|||
|
|
NativeUtils.forceOrientationPortrait();
|
|||
|
|
}else{
|
|||
|
|
NativeUtils.forceOrientationLandscape();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void InvokeChangeEvent(){
|
|||
|
|
switch(deviceOrientation){
|
|||
|
|
case DeviceOrientation.Portrait:
|
|||
|
|
case DeviceOrientation.PortraitUpsideDown:
|
|||
|
|
if(ScreenExtensions.IsNarrowScreen()){
|
|||
|
|
Vector4 size = new Vector4(44, 34, 0, 0);
|
|||
|
|
Rect rect = new Rect(1.0f - (375.0f - size.z) / 375.0f, 1.0f - (812.0f - size.y) / 812.0f, (375.0f - size.z - size.w) / 375.0f, (812.0f - size.x - size.y) / 812.0f);
|
|||
|
|
foreach(var camera in cameraArray){
|
|||
|
|
camera.rect = rect;
|
|||
|
|
}
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
}else{
|
|||
|
|
Rect rect = new Rect(0, 0, 1, 1);
|
|||
|
|
foreach(var camera in cameraArray){
|
|||
|
|
camera.rect = rect;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.LandscapeLeft:
|
|||
|
|
case DeviceOrientation.LandscapeRight:
|
|||
|
|
if(ScreenExtensions.IsNarrowScreen()){
|
|||
|
|
Vector4 size = new Vector4(0, 0, 64, 64);
|
|||
|
|
Rect rect = new Rect(1.0f - (812.0f - size.z) / 812.0f, 1.0f - (375.0f - size.y) / 375.0f, (812.0f - size.z - size.w) / 812.0f, (375.0f - size.x - size.y) / 375.0f);
|
|||
|
|
foreach(var camera in cameraArray){
|
|||
|
|
camera.rect = rect;
|
|||
|
|
}
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
}else{
|
|||
|
|
Rect rect = new Rect(0, 0, 1, 1);
|
|||
|
|
foreach(var camera in cameraArray){
|
|||
|
|
camera.rect = rect;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
onChangeDeviceOrientation.Invoke(deviceOrientation);
|
|||
|
|
switch(deviceOrientation){
|
|||
|
|
case DeviceOrientation.Portrait:
|
|||
|
|
case DeviceOrientation.PortraitUpsideDown:
|
|||
|
|
onChangeToDeviceOrientationPortrait.Invoke(deviceOrientation);
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.LandscapeLeft:
|
|||
|
|
case DeviceOrientation.LandscapeRight:
|
|||
|
|
onChangeToDeviceOrientationLandscape.Invoke(deviceOrientation);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private DeviceOrientation GetDeviceOrientation(int width, int height){
|
|||
|
|
DeviceOrientation result = Input.deviceOrientation;
|
|||
|
|
switch(result){
|
|||
|
|
case DeviceOrientation.Unknown:
|
|||
|
|
case DeviceOrientation.FaceUp:
|
|||
|
|
case DeviceOrientation.FaceDown:
|
|||
|
|
if(deviceOrientation == DeviceOrientation.Unknown || screenWidth != width || screenHeight != height){
|
|||
|
|
// 正確にはInput.accelerationを見るのが良いと思うが、基本設定で切っている為ScreenSizeでチェックを行う
|
|||
|
|
result = width < height ? DeviceOrientation.Portrait : DeviceOrientation.LandscapeLeft;
|
|||
|
|
}else{
|
|||
|
|
result = deviceOrientation;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.Portrait:
|
|||
|
|
result = width < height ? DeviceOrientation.Portrait : DeviceOrientation.LandscapeLeft;
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.PortraitUpsideDown:
|
|||
|
|
result = width < height ? DeviceOrientation.PortraitUpsideDown : DeviceOrientation.LandscapeLeft;
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.LandscapeLeft:
|
|||
|
|
result = width < height ? DeviceOrientation.Portrait : DeviceOrientation.LandscapeLeft;
|
|||
|
|
break;
|
|||
|
|
case DeviceOrientation.LandscapeRight:
|
|||
|
|
result = width < height ? DeviceOrientation.Portrait : DeviceOrientation.LandscapeRight;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
}
|