popcorn/Scripts/Utilities/DeviceOrientationChecker.cs

160 lines
5.5 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}