Unity3d android считать настройку автоповорота экрана
Как в Unity в приложении под android считать текущую настройку автоповорота экрана, которую задал пользователь в настройках телефона?
Мое приложение умеет работать в разной ориентации экрана, но почему-то всегда реагирует на поворот экрана. Мне же нужно, чтобы приложение реагировало на поворот только если пользователь включил (разрешил) в телефоне "Автоповорот", если же запретил - то приложение не должно реагировать на поворот.
Ответы (2 шт):
Автор решения: Olmicron
→ Ссылка
Вот тут есть возможное решение.
void OnApplicationFocus(bool haveFocus)
{
if (haveFocus) GameScreen.ToggleAutoRotation();
}
static void ToggleAutoRotation()
{
AutoRotationOn = DeviceAutoRotationIsOn();
Screen.autorotateToPortrait = AutoRotationOn;
Screen.autorotateToPortraitUpsideDown = AutoRotationOn;
Screen.autorotateToLandscapeLeft = AutoRotationOn;
Screen.autorotateToLandscapeRight = AutoRotationOn;
Screen.orientation = ScreenOrientation.AutoRotation;
}
static bool DeviceAutoRotationIsOn()
{
#if UNITY_ANDROID && !UNITY_EDITOR
using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
var context = actClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass systemGlobal = new AndroidJavaClass("android.provider.Settings$System");
var rotationOn = systemGlobal.CallStatic<int>("getInt", context.Call<AndroidJavaObject>("getContentResolver"), "accelerometer_rotation");
return rotationOn==1;
}
#endif
return true;
}
Автор решения: Петр Варягин
→ Ссылка
Добавлю сюда доработанный вариант, а то предложенный в ответе не компилировался.
using UnityEngine;
namespace MyUtils
{
/// <summary>
/// На Android текущая настройка автоповорота экрана, которую задал пользователь в настройках телефона, почему-то игнорируется Unity.
/// Подпора данной ситуации находится в этом классе.
/// https://ru.stackoverflow.com/questions/1086526/unity3d-android-%d1%81%d1%87%d0%b8%d1%82%d0%b0%d1%82%d1%8c-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d1%83-%d0%b0%d0%b2%d1%82%d0%be%d0%bf%d0%be%d0%b2%d0%be%d1%80%d0%be%d1%82%d0%b0-%d1%8d%d0%ba%d1%80%d0%b0%d0%bd%d0%b0/1086532#1086532
/// </summary>
public class FixAndroidScreenAutoRotationScript : MonoBehaviour
{
/* Если надо все то же самое на нескольких сценах, то можно сделать примерно так здесь или в классе-контейнере:
private FixAndroidScreenAutoRotationScript instance;
private void Start()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
Destroy(gameObject);
}*/
private void OnApplicationFocus(bool haveFocus)
{
if (haveFocus)
{
bool autoRotation = SetAutoRotation();
Debug.Log(nameof(OnApplicationFocus) + ": " + nameof(autoRotation) + "=" + autoRotation.ToString());
}
}
private static bool SetAutoRotation()
{
bool autoRotation = GetDeviceAutoRotation();
Screen.autorotateToPortrait = autoRotation;
Screen.autorotateToPortraitUpsideDown = autoRotation;
Screen.autorotateToLandscapeLeft = autoRotation;
Screen.autorotateToLandscapeRight = autoRotation;
Screen.orientation = ScreenOrientation.AutoRotation;
return autoRotation;
}
private static bool GetDeviceAutoRotation()
{
#if UNITY_ANDROID && !UNITY_EDITOR
using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
var context = actClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass systemGlobal = new AndroidJavaClass("android.provider.Settings$System");
var rotationOn = systemGlobal.CallStatic<int>("getInt", context.Call<AndroidJavaObject>("getContentResolver"), "accelerometer_rotation");
return rotationOn == 1;
}
#else
return true;
#endif
}
}
}