PlatformConfig.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /*******************************************************************************
  2. Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
  3. NOTICE:All information contained herein is, and remains the property of
  4. PICO Technology Co., Ltd. The intellectual and technical concepts
  5. contained herein are proprietary to PICO Technology Co., Ltd. and may be
  6. covered by patents, patents in process, and are protected by trade secret or
  7. copyright law. Dissemination of this information or reproduction of this
  8. material is strictly forbidden unless prior written permission is obtained from
  9. PICO Technology Co., Ltd.
  10. *******************************************************************************/
  11. using System;
  12. using Unity.XR.PXR;
  13. using UnityEditor;
  14. using UnityEngine;
  15. namespace Pico.Platform.Editor
  16. {
  17. public class PicoSettings : EditorWindow
  18. {
  19. enum Language
  20. {
  21. English = 0,
  22. Chinese = 1,
  23. }
  24. private SerializedObject serObj;
  25. private SerializedProperty gosPty;
  26. static Language language = Language.English;
  27. static string[] strAppIdText = {"Paste your App ID here", "请粘贴你的AppID"};
  28. static string[] strAppIdHelpText = {"App ID is the unique identification ID of the PICO Application. Without AppID, you will not be able to use PICO platform feature.", "APP ID 是应用的唯一标识"};
  29. static string[] strBuildSettingText = {"Recommend Settings [?]", "推荐设置"};
  30. static string[] strBuildSettingHelpText = {"Recommended project settings for PXR SDK", "推荐项目设置"};
  31. static string[] strPlatformBuildText = {"Set Platform To Android", "设置目标平台为Android"};
  32. static string[] strUnityVersionLimit = {$"Unity Editor Version ≥ {EditorConf.minEditorVersion}", $"Unity Editor版本不小于{EditorConf.minEditorVersion}"};
  33. static string[] strOrientationBuildText = {"Set Orientation To LandscapeLeft", "设置屏幕方向为水平"};
  34. static string[] strMinApiLevel = {$"Android Min API Level ≥ {EditorConf.minSdkLevel}", $"Android最小API不低于{EditorConf.minSdkLevel}"};
  35. static string[] strIgnoreButtonText = {"Ask me later", "稍后询问"};
  36. static string[] strApplyButtonText = {"Apply", "应用"};
  37. static string[] strHighlightText = {"Use Highlight", "开启高光时刻"};
  38. private class Res
  39. {
  40. public readonly Texture PicoDeveloper;
  41. public string Correct = "✔️";
  42. public string Wrong = "×";
  43. public GUIStyle correctStyle;
  44. public GUIStyle wrongStyle;
  45. public Res()
  46. {
  47. this.PicoDeveloper = Resources.Load<Texture>("PICODeveloper");
  48. correctStyle = new GUIStyle(GUI.skin.label);
  49. correctStyle.normal.textColor = Color.green;
  50. wrongStyle = new GUIStyle();
  51. wrongStyle.normal.textColor = Color.red;
  52. wrongStyle.fontStyle = FontStyle.Bold;
  53. }
  54. }
  55. private Res _R;
  56. private Res R
  57. {
  58. get
  59. {
  60. if (_R != null) return _R;
  61. _R = new Res();
  62. return _R;
  63. }
  64. }
  65. internal enum ConfigStatus
  66. {
  67. Correct,
  68. Wrong,
  69. Fix,
  70. Hide,
  71. }
  72. internal abstract class ConfigField
  73. {
  74. public bool value = true;
  75. public abstract string[] GetText();
  76. public abstract ConfigStatus GetStatus();
  77. public abstract void Fix();
  78. }
  79. internal class ConfigIsAndroid : ConfigField
  80. {
  81. public override string[] GetText()
  82. {
  83. return strPlatformBuildText;
  84. }
  85. public override ConfigStatus GetStatus()
  86. {
  87. return Gs.buildTargetGroup == BuildTargetGroup.Android ? ConfigStatus.Correct : ConfigStatus.Fix;
  88. }
  89. public override void Fix()
  90. {
  91. Gs.buildTargetGroup = BuildTargetGroup.Android;
  92. }
  93. }
  94. internal class ConfigIsLandscapeLeft : ConfigField
  95. {
  96. public override string[] GetText()
  97. {
  98. return strOrientationBuildText;
  99. }
  100. public override ConfigStatus GetStatus()
  101. {
  102. return Gs.UIOrientation == UIOrientation.LandscapeLeft ? ConfigStatus.Correct : ConfigStatus.Fix;
  103. }
  104. public override void Fix()
  105. {
  106. Gs.UIOrientation = UIOrientation.LandscapeLeft;
  107. }
  108. }
  109. internal class ConfigMinApiLevel : ConfigField
  110. {
  111. public override string[] GetText()
  112. {
  113. return strMinApiLevel;
  114. }
  115. public override ConfigStatus GetStatus()
  116. {
  117. return Gs.minimumApiLevel >= (AndroidSdkVersions) EditorConf.minSdkLevel ? ConfigStatus.Correct : ConfigStatus.Fix;
  118. }
  119. public override void Fix()
  120. {
  121. Gs.minimumApiLevel = (AndroidSdkVersions) EditorConf.minSdkLevel;
  122. }
  123. }
  124. internal class ConfigUnityVersion : ConfigField
  125. {
  126. public override string[] GetText()
  127. {
  128. return strUnityVersionLimit;
  129. }
  130. public override ConfigStatus GetStatus()
  131. {
  132. return String.Compare(Application.unityVersion, EditorConf.minEditorVersion, StringComparison.Ordinal) >= 0 ? ConfigStatus.Hide : ConfigStatus.Wrong;
  133. }
  134. public override void Fix()
  135. {
  136. throw new NotImplementedException();
  137. }
  138. }
  139. public static string appId
  140. {
  141. get { return PicoGs.appId; }
  142. set { PicoGs.appId = value; }
  143. }
  144. public static bool useHighlight
  145. {
  146. get { return PicoGs.useHighlight; }
  147. set { PicoGs.useHighlight = value; }
  148. }
  149. bool enableEC
  150. {
  151. get { return PicoGs.enableEntitlementCheck; }
  152. set { PicoGs.enableEntitlementCheck = value; }
  153. }
  154. private ConfigField[] configFields;
  155. private void OnEnable()
  156. {
  157. configFields = new ConfigField[]
  158. {
  159. new ConfigUnityVersion(),
  160. new ConfigIsAndroid(),
  161. new ConfigIsLandscapeLeft(),
  162. new ConfigMinApiLevel(),
  163. };
  164. this.titleContent = new GUIContent("PICO Platform Settings");
  165. language = Language.English;
  166. if (Application.systemLanguage == SystemLanguage.Chinese || Application.systemLanguage == SystemLanguage.ChineseSimplified || Application.systemLanguage == SystemLanguage.ChineseTraditional)
  167. {
  168. language = Language.Chinese;
  169. }
  170. serObj = new SerializedObject(PXR_PlatformSetting.Instance);
  171. gosPty = serObj.FindProperty(nameof(PXR_PlatformSetting.deviceSN));
  172. }
  173. Vector2 scrollPos;
  174. void OnGUI()
  175. {
  176. var frameWidth = 380;
  177. //顶部图片
  178. {
  179. GUIStyle style = new GUIStyle();
  180. style.stretchWidth = true;
  181. style.fixedWidth = 400;
  182. GUILayout.Label(R.PicoDeveloper, style);
  183. }
  184. //顶部中英文选择
  185. {
  186. GUIStyle activeStyle = new GUIStyle();
  187. activeStyle.alignment = TextAnchor.MiddleCenter;
  188. activeStyle.normal.textColor = new Color(0, 122f / 255f, 204f / 255f);
  189. GUIStyle normalStyle = new GUIStyle();
  190. normalStyle.alignment = TextAnchor.MiddleCenter;
  191. normalStyle.normal.textColor = new Color(0.8f, 0.8f, 0.8f);
  192. GUILayout.BeginHorizontal();
  193. GUILayout.FlexibleSpace();
  194. if (GUILayout.Button("ENGLISH", language == Language.English ? activeStyle : normalStyle, GUILayout.Width(80)))
  195. {
  196. language = Language.English;
  197. }
  198. GUILayout.Label("|", normalStyle, GUILayout.Width(5));
  199. if (GUILayout.Button("中文", language == Language.Chinese ? activeStyle : normalStyle, GUILayout.Width(80)))
  200. {
  201. language = Language.Chinese;
  202. }
  203. GUILayout.FlexibleSpace();
  204. GUILayout.EndHorizontal();
  205. }
  206. {
  207. GUIStyle style = new GUIStyle();
  208. style.margin = new RectOffset(5, 5, 5, 5);
  209. GUILayout.BeginVertical(style, GUILayout.Width(360));
  210. }
  211. //AppID设置
  212. {
  213. GUILayout.Space(15);
  214. GUILayout.Label(strAppIdText[(int) language]);
  215. appId = EditorGUILayout.TextField(appId, GUILayout.Width(frameWidth));
  216. if (string.IsNullOrWhiteSpace(appId))
  217. {
  218. EditorGUILayout.HelpBox(strAppIdHelpText[(int) language], UnityEditor.MessageType.Warning);
  219. }
  220. GUILayout.Space(20);
  221. if (appId == "")
  222. {
  223. GUI.enabled = false;
  224. enableEC = false;
  225. }
  226. else
  227. {
  228. GUI.enabled = true;
  229. }
  230. }
  231. //Highlight设置
  232. {
  233. EditorGUILayout.BeginHorizontal();
  234. GUILayout.Label(strHighlightText[(int) language]);
  235. useHighlight = EditorGUILayout.Toggle(useHighlight, GUILayout.Width(frameWidth));
  236. EditorGUILayout.EndHorizontal();
  237. }
  238. //Recommend Settings
  239. {
  240. GUILayout.Space(5);
  241. GUILayout.Label(new GUIContent(strBuildSettingText[(int) language], strBuildSettingHelpText[(int) language]));
  242. GUIStyle style = "frameBox";
  243. style.fixedWidth = frameWidth;
  244. EditorGUILayout.BeginVertical(style);
  245. foreach (var field in configFields)
  246. {
  247. var txt = field.GetText()[(int) language];
  248. switch (field.GetStatus())
  249. {
  250. case ConfigStatus.Correct:
  251. {
  252. EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth));
  253. EditorGUILayout.LabelField(txt);
  254. EditorGUILayout.LabelField(R.Correct, R.correctStyle);
  255. GUI.enabled = true;
  256. EditorGUILayout.EndHorizontal();
  257. break;
  258. }
  259. case ConfigStatus.Wrong:
  260. {
  261. EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth));
  262. EditorGUILayout.LabelField(txt);
  263. EditorGUILayout.LabelField(R.Wrong, R.wrongStyle);
  264. EditorGUILayout.EndHorizontal();
  265. break;
  266. }
  267. case ConfigStatus.Hide:
  268. {
  269. break;
  270. }
  271. case ConfigStatus.Fix:
  272. {
  273. EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth));
  274. EditorGUILayout.LabelField(txt);
  275. float originalValue = EditorGUIUtility.labelWidth;
  276. EditorGUIUtility.labelWidth = 250;
  277. field.value = EditorGUILayout.Toggle(field.value);
  278. EditorGUIUtility.labelWidth = originalValue;
  279. EditorGUILayout.EndHorizontal();
  280. break;
  281. }
  282. default:
  283. {
  284. Debug.LogWarning($"unhandled ConfigStatus {txt} {field.GetStatus()}");
  285. break;
  286. }
  287. }
  288. }
  289. EditorGUILayout.EndVertical();
  290. }
  291. //按钮区域
  292. {
  293. var hasSomethingToFix = false;
  294. foreach (var field in configFields)
  295. {
  296. if (field.GetStatus() == ConfigStatus.Fix && field.value)
  297. {
  298. hasSomethingToFix = true;
  299. break;
  300. }
  301. }
  302. if (hasSomethingToFix)
  303. {
  304. GUILayout.Space(10);
  305. GUILayout.BeginHorizontal();
  306. GUILayout.FlexibleSpace();
  307. if (GUILayout.Button(strIgnoreButtonText[(int) language], GUILayout.Width(130)))
  308. {
  309. this.Close();
  310. }
  311. GUI.enabled = hasSomethingToFix;
  312. if (GUILayout.Button(strApplyButtonText[(int) language], GUILayout.Width(130)))
  313. {
  314. this.ApplyRecommendConfig();
  315. }
  316. GUI.enabled = true;
  317. GUILayout.FlexibleSpace();
  318. GUILayout.EndHorizontal();
  319. GUILayout.FlexibleSpace();
  320. }
  321. }
  322. GUILayout.EndVertical();
  323. }
  324. private void ApplyRecommendConfig()
  325. {
  326. foreach (var field in configFields)
  327. {
  328. if (field.GetStatus() == ConfigStatus.Fix && field.value)
  329. {
  330. field.Fix();
  331. }
  332. }
  333. }
  334. }
  335. }