NaturalOrientation.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using UnityEngine;
  2. using System.Collections;
  3. public class NaturalOrientation : MonoBehaviour {
  4. public static int ORIENTATION_UNDEFINED = 0x00000000;
  5. public static int ORIENTATION_PORTRAIT = 0x00000001;
  6. public static int ORIENTATION_LANDSCAPE = 0x00000002;
  7. public static int ROTATION_0 = 0x00000000;
  8. public static int ROTATION_180 = 0x00000002;
  9. public static int ROTATION_270 = 0x00000003;
  10. public static int ROTATION_90 = 0x00000001;
  11. public static int PORTRAIT = 0;
  12. public static int PORTRAIT_UPSIDEDOWN = 1;
  13. public static int LANDSCAPE = 2;
  14. public static int LANDSCAPE_LEFT = 3;
  15. #if UNITY_ANDROID && !UNITY_EDITOR
  16. AndroidJavaObject mConfig;
  17. AndroidJavaObject mWindowManager;
  18. private static float density;
  19. private static int densitydpi;
  20. private static int vpixels;
  21. private static int hpixels;
  22. private static float scaledDensity;
  23. private static float ydpi;
  24. private static float xdpi;
  25. private static float xmm;
  26. private static float ymm;
  27. private static float mmdist;
  28. private static float correction_factor = 0.0f;
  29. private static AndroidJavaObject windowManagerInstance;
  30. private static AndroidJavaObject displayInstance;
  31. private static AndroidJavaObject metricsClass;
  32. private static AndroidJavaObject metricsInstance;
  33. // Use this for initialization
  34. void Start () {
  35. AndroidJavaClass majcUnityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  36. AndroidJavaObject majoDivePluginInstance = majcUnityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
  37. metricsClass= new AndroidJavaClass("android.util.DisplayMetrics");
  38. metricsInstance= new AndroidJavaObject("android.util.DisplayMetrics");
  39. windowManagerInstance=majoDivePluginInstance.Call<AndroidJavaObject>("getWindowManager");
  40. displayInstance=windowManagerInstance.Call<AndroidJavaObject>("getDefaultDisplay");
  41. displayInstance.Call("getMetrics",metricsInstance);
  42. density=metricsInstance.Get<float>("density");
  43. densitydpi=metricsInstance.Get<int> ("densityDpi");
  44. vpixels=metricsInstance.Get<int>("heightPixels");
  45. vpixels=Screen.height;
  46. hpixels=metricsInstance.Get<int>("widthPixels");
  47. //hpixels=displayInstance.Call<int>("getWidth");
  48. hpixels=Screen.width;
  49. scaledDensity=metricsInstance.Get<float>("scaledDensity");
  50. xdpi=metricsInstance.Get<float>("xdpi");
  51. ydpi=metricsInstance.Get<float>("ydpi");
  52. xmm=hpixels/xdpi/0.0393701f;
  53. ymm=vpixels/ydpi/0.0393701f;
  54. hpixels=Screen.width;
  55. vpixels=Screen.height;
  56. xmm=hpixels/xdpi/0.0393701f;
  57. ymm=vpixels/ydpi/0.0393701f;
  58. mmdist=xmm/2;
  59. }
  60. // Update is called once per frame
  61. void Update () {
  62. correction_factor=0.002f*((mmdist-55.0f)/(76.0f-55.0f));
  63. if(OffsetCenter.instance !=null){
  64. OffsetCenter.instance.setCorrectionFactor(correction_factor);
  65. }
  66. }
  67. //adapted from http://stackoverflow.com/questions/4553650/how-to-check-device-natural-default-orientation-on-android-i-e-get-landscape/4555528#4555528
  68. public int GetDeviceDefaultOrientation()
  69. {
  70. if ((mWindowManager == null) || (mConfig == null))
  71. {
  72. using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").
  73. GetStatic<AndroidJavaObject>("currentActivity"))
  74. {
  75. mWindowManager = activity.Call<AndroidJavaObject>("getSystemService","window");
  76. mConfig = activity.Call<AndroidJavaObject>("getResources").Call<AndroidJavaObject>("getConfiguration");
  77. }
  78. }
  79. int lRotation = mWindowManager.Call<AndroidJavaObject>("getDefaultDisplay").Call<int>("getRotation");
  80. int dOrientation = mConfig.Get<int>("orientation");
  81. if( (((lRotation == ROTATION_0) || (lRotation == ROTATION_180)) && (dOrientation == ORIENTATION_LANDSCAPE)) ||
  82. (((lRotation == ROTATION_90) || (lRotation == ROTATION_270)) && (dOrientation == ORIENTATION_PORTRAIT)))
  83. {
  84. return(LANDSCAPE); //TABLET
  85. }
  86. return (PORTRAIT); //PHONE
  87. }
  88. #endif
  89. }