HomeView_ChallengeOption.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. using AppUI.Bluetooth;
  2. using EasingCore;
  3. using FancyScrollView;
  4. using FancyScrollView.FocusOn;
  5. using JC;
  6. using System;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using UnityEngine;
  11. using UnityEngine.Localization.Settings;
  12. using UnityEngine.SceneManagement;
  13. using UnityEngine.UI;
  14. [Serializable]
  15. public class LevelInfo
  16. {
  17. public string Name;
  18. public Sprite Icon;
  19. //自动语言转换id
  20. public string textId;
  21. //添加哪个语言脚本
  22. public int languageType = 0;
  23. public int startGameType = -1;
  24. public LevelInfo(string name, string textId, Sprite icon, int languageType, int gameType)
  25. {
  26. Name = name;
  27. this.textId = textId;
  28. Icon = icon;
  29. this.languageType = languageType;
  30. startGameType = gameType;
  31. }
  32. }
  33. public class HomeView_ChallengeOption : MonoBehaviour
  34. {
  35. public GameObject entryList;
  36. [SerializeField] ScrollView scrollView = default;
  37. [SerializeField] Button prevCellButton = default;
  38. [SerializeField] Button nextCellButton = default;
  39. [SerializeField] ScrollPanel productsPanel;
  40. [Tooltip("所有关卡的设置信息")]
  41. public List<LevelInfo> levelInfos;
  42. List<LevelInfo> _tempLevelInfos = new List<LevelInfo>();
  43. //弓箭游戏列表
  44. List<string> gameTextIds = new List<string> { "OlynpicArchery", "WolfHunt", "LevelWildAttack", "FruitExpert", "LevelDuckHunter", "HareHunt", "PheasuntHunt"};
  45. //切换枪械情况下切换这个游戏列表
  46. //OlynpicArcheryGun 是射击版的OlynpicArchery
  47. List<string> gameTextIds_gun = new List<string> { "OlynpicArcheryGun", "FruitExpert", "ShotSimulator" , "MovingTarget" , "LevelDuckHunter" };
  48. //#if UNITY_ANDROID
  49. // List<String> gameTextIds = new List<string> { "OlynpicArchery", "LevelWildAttack", "FruitExpert", "LevelDuckHunter" };
  50. //#else
  51. // List<String> gameTextIds = new List<string>{ "OlynpicArchery", "WolfHunt", "LevelWildAttack", "FruitExpert", "LevelDuckHunter", "HareHunt", "PheasuntHunt" };
  52. //#endif
  53. void Awake()
  54. {
  55. //根据条件激活野鸡关卡或野鸭关卡
  56. //if (CommonConfig.AppArea == 0)
  57. //{
  58. // entryList.transform.Find("Item1").gameObject.SetActive(GlobalDataTemp.pkMatchType != PKMatchType.None);
  59. // entryList.transform.Find("Item3").gameObject.SetActive(GlobalDataTemp.pkMatchType == PKMatchType.None);
  60. //}
  61. //else
  62. //{
  63. // entryList.transform.Find("Item1").gameObject.SetActive(true);
  64. // entryList.transform.Find("Item3").gameObject.SetActive(false);
  65. //}
  66. //entryList.transform.Find("Item4").gameObject.SetActive(GlobalDataTemp.pkMatchType == PKMatchType.None);
  67. //transform.Find("BtnFruitMaster").gameObject.SetActive(GlobalDataTemp.pkMatchType == PKMatchType.None);
  68. //增加了对两个按钮事件的响应
  69. prevCellButton.onClick.AddListener(() => {
  70. scrollView.SelectPrevCell();
  71. });
  72. nextCellButton.onClick.AddListener(() => {
  73. scrollView.SelectNextCell();
  74. });
  75. //对选中的当前对象的下标的显示
  76. scrollView.OnSelectionChanged(OnSelectionChanged);
  77. }
  78. void Start()
  79. {
  80. //按 gameTextIds 重新排序
  81. //for (int i = 0; i < gameTextIds.Count; i++)
  82. //{
  83. // for (int j = 0; j < levelInfos.Count; j++)
  84. // {
  85. // if (gameTextIds[i] == levelInfos[j].textId)
  86. // {
  87. // _tempLevelInfos.Add(levelInfos[j]);
  88. // break;
  89. // }
  90. // }
  91. //}
  92. //var _items = Enumerable.Range(0, 21)
  93. // .Select(i => {
  94. // int _index = Mathf.FloorToInt(i % _tempLevelInfos.Count);
  95. // LevelInfo levelInfo = _tempLevelInfos[_index];
  96. // //Debug.Log("初始化:"+i+",index:"+_index);
  97. // return new ItemData(levelInfo.Name, levelInfo.Icon, levelInfo.textId, levelInfo.languageType);
  98. // })
  99. // .ToArray();
  100. //scrollView.UpdateData(_items);
  101. //scrollView.SelectCell(0);
  102. }
  103. /// <summary>
  104. /// 原本的levelInfos在面板已经添加信息,动态向levels添加信息
  105. /// </summary>
  106. public void AddLevelInfo() {
  107. //尝试动态添加一个图片
  108. Sprite ShootingTrainingIcon = Resources.Load<Sprite>("Textures/GameIcon/ShotSimulator_level"); // Resources/Textures/GameIcon/movingTarget_level.png
  109. //添加首页射击训练内容
  110. levelInfos.Add(new LevelInfo("射击实验室", "ShotSimulator", ShootingTrainingIcon, 2, 17));
  111. //gameTextIds.Add("ShotSimulator");
  112. //gameTextIds_gun.Add("ShotSimulator");
  113. }
  114. //通过面板 HomeView_TopBarView.onChangeTypeEvent 调用
  115. //根据选择的模式来切换内容
  116. public void refreshList(DeviceMode deviceMode) {
  117. Debug.Log("refreshList:"+ deviceMode);
  118. List<string> _gameTextIds = new();
  119. if (deviceMode == DeviceMode.Archery)
  120. {
  121. _gameTextIds = gameTextIds;
  122. }
  123. else if (deviceMode == DeviceMode.Gun) {
  124. _gameTextIds = gameTextIds_gun;
  125. }
  126. if (_gameTextIds.Count == 0) return;
  127. _tempLevelInfos.Clear();
  128. //按 gameTextIds 重新排序
  129. for (int i = 0; i < _gameTextIds.Count; i++)
  130. {
  131. for (int j = 0; j < levelInfos.Count; j++)
  132. {
  133. if (_gameTextIds[i] == levelInfos[j].textId)
  134. {
  135. _tempLevelInfos.Add(levelInfos[j]);
  136. break;
  137. }
  138. }
  139. }
  140. Debug.Log("图标生成的数量是:"+ _gameTextIds.Count * 3);
  141. var _items = Enumerable.Range(0, _gameTextIds.Count*3)
  142. .Select(i => {
  143. int _index = Mathf.FloorToInt(i % _tempLevelInfos.Count);
  144. LevelInfo levelInfo = _tempLevelInfos[_index];
  145. //Debug.Log("初始化:"+i+",index:"+_index);
  146. return new ItemData(levelInfo.Name, levelInfo.Icon, levelInfo.textId, levelInfo.languageType);
  147. })
  148. .ToArray();
  149. scrollView.UpdateData(_items);
  150. scrollView.SelectCell(0);
  151. }
  152. void OnDestroy()
  153. {
  154. }
  155. bool _InitProductsPanel = false;
  156. void InitProductsPanel()
  157. {
  158. int page = 1;
  159. //增加了对两个按钮事件的响应
  160. prevCellButton.onClick.AddListener(() => {
  161. productsPanel.MoveNextToCenter(-page);
  162. });
  163. nextCellButton.onClick.AddListener(() => {
  164. productsPanel.MoveNextToCenter(page);
  165. });
  166. var games = levelInfos.Select(i => new ItemData(i.Name, i.Icon, i.textId, i.languageType))
  167. .ToArray();
  168. if (!_InitProductsPanel)
  169. {
  170. _InitProductsPanel = true;
  171. productsPanel.onReceiveItemViewInfo.AddListener(onReceiveItemViewInfo);
  172. productsPanel.onItemChange.AddListener(delegate (RectTransform item, int index) {
  173. //Debug.Log("----index:"+ index);
  174. });
  175. int gameIndex = 0;
  176. foreach (var game in games)
  177. {
  178. var gameObj = Instantiate(productsPanel.prefabs[0], productsPanel.GetComponent<ScrollRect>().content);
  179. //Game_Cell gameCell = gameObj.GetComponent<Game_Cell>();
  180. //gameCell.Initialize(gameIndex, (index)=> {
  181. // OnSelectionChanged(index);
  182. // for (int i = 0; i < productsPanel.itemList.Count; i++)
  183. // {
  184. // productsPanel.itemList[i].GetComponent<Game_Cell>().onSelected(index);
  185. // }
  186. //});
  187. //gameCell.UpdateContent(game);
  188. productsPanel.AddItem(gameObj.GetComponent<RectTransform>());
  189. gameIndex++;
  190. }
  191. productsPanel.UpdateItems();
  192. productsPanel.SelectItemByStartIndex();
  193. }
  194. }
  195. void onReceiveItemViewInfo(RectTransform item, Vector3 positionInView, Vector2 viewSize)
  196. {
  197. //float distanceRate = Mathf.Abs(positionInView.x * 2) / viewSize.x;
  198. //float scaleRate = 1f - 0.2f * distanceRate;
  199. //item.Find("Box").localScale = new Vector3(scaleRate, scaleRate, 1);
  200. }
  201. //游戏选择回调 scroll view control
  202. void OnSelectionChanged(int index, bool selected)
  203. {
  204. //Debug.Log(index + ":" + _tempLevelInfos[Mathf.FloorToInt(index % _tempLevelInfos.Count)].Name);
  205. LevelInfo _levelInfo = _tempLevelInfos[Mathf.FloorToInt(index % _tempLevelInfos.Count)];
  206. if (_levelInfo.startGameType != -1 && selected)
  207. {
  208. JudgmentMode(_levelInfo.startGameType);
  209. }
  210. //Debug.Log(str);
  211. }
  212. /*
  213. 只有奥运射箭,打野鸡,打野兔,打野狼这四个最初的游戏,才有这三个模式选择;还有三个新的游戏,只有一个本地游戏的模式,那就不用选择,直接进入游戏
  214. */
  215. void JudgmentMode(int _startGameType) {
  216. //_startGameType 这里gameType仅仅用于判断模式
  217. switch (_startGameType)
  218. {
  219. case 1: //奥运射箭
  220. case 3: //打野兔
  221. case 4: //打野鸡
  222. case 5: //打野狼
  223. //case 14://塔防射击,增加一个选择双人模式
  224. GameMgr.judgmentGameType = _startGameType;
  225. AudioMgr.ins.PlayBtn();
  226. //进入模式选择页面
  227. ViewMgr.Instance.ShowView<ModeSelectView>();
  228. //连接弓箭并且是9轴的情况下
  229. if (_startGameType == 1 && SmartBowDeviceHub.ins?.Aim?.bRuning9Axis() == true)
  230. {
  231. ModeSelectView.ins.isShowButton = true;
  232. ModeSelectView.ins.isShowLocalPKBtn = true;
  233. ModeSelectView.ins.isShowNetworkPKBtn = true;
  234. }
  235. else if (_startGameType == 14) {
  236. ModeSelectView.ins.isShowButton = true;
  237. ModeSelectView.ins.isShowLocalPKBtn = false;
  238. ModeSelectView.ins.isShowNetworkPKBtn = false;
  239. }
  240. else
  241. {
  242. ModeSelectView.ins.isShowButton = false;
  243. ModeSelectView.ins.isShowLocalPKBtn = true;
  244. ModeSelectView.ins.isShowNetworkPKBtn = true;
  245. }
  246. //if (GlobalData.MyDeviceMode == DeviceMode.Gun)
  247. //{
  248. // ModeSelectView.ins.InitGunButtons();
  249. //}
  250. //else {
  251. // //连接弓箭
  252. // if (_startGameType == 1)
  253. // {
  254. // //当连接HOUYI Pro和其他红外设备时候,双弓射箭也需要屏蔽掉
  255. // if (BluetoothAim.ins.isMainConnectToInfraredDevice())
  256. // {
  257. // ModeSelectView.ins.isShowButton = false;
  258. // }
  259. // else {
  260. // ModeSelectView.ins.isShowButton = true;
  261. // }
  262. // }
  263. // else
  264. // {
  265. // ModeSelectView.ins.isShowButton = false;
  266. // }
  267. // ModeSelectView.ins.InitButtons();
  268. //}
  269. break;
  270. default:
  271. StartGame(_startGameType);
  272. break;
  273. }
  274. }
  275. //只有一个本地游戏的模式,没有其他模式
  276. void StartGame(int gameType)
  277. {
  278. //Debug.Log("gameType:"+ gameType+ ",GlobalDataTemp.pkMatchType:"+ GlobalDataTemp.pkMatchType);
  279. AudioMgr.ins.PlayBtn();
  280. GameMgr.gameType = gameType;
  281. GlobalData.singlePlayerGameType = gameType;
  282. if (gameType == 15)
  283. {
  284. SceneManager.LoadScene("FruitMaster", LoadSceneMode.Single);
  285. }
  286. else if (gameType == 14)
  287. {
  288. SceneManager.LoadScene("WildAttack", LoadSceneMode.Single);
  289. }
  290. else if (gameType == 13)
  291. {
  292. SceneManager.LoadScene("DuckHunter", LoadSceneMode.Single);
  293. }
  294. else if (gameType == 16) {
  295. //MovingTarget
  296. SceneManager.LoadScene("Hyperspace01", LoadSceneMode.Single);
  297. }
  298. else if (gameType == 17)
  299. {
  300. //进入模拟射击之前调用其语言
  301. string language = "zh-Hans";
  302. if (TextAutoLanguage2.GetLanguage() == LanguageEnum.English) {
  303. language = "en";
  304. }
  305. else if (TextAutoLanguage2.GetLanguage() == LanguageEnum.Japan)
  306. {
  307. language = "ja";
  308. }
  309. LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.GetLocale(new UnityEngine.Localization.
  310. LocaleIdentifier(language));
  311. //ShotSimulatorScene
  312. SceneManager.LoadScene("ShotSimulatorScene", LoadSceneMode.Single);
  313. }
  314. }
  315. public void back()
  316. {
  317. AudioMgr.ins.PlayBtn();
  318. ViewMgr.Instance.DestroyView<ChallengeOptionView>();
  319. }
  320. public bool OnMenuBack()
  321. {
  322. ViewMgr.Instance.DestroyView<ChallengeOptionView>();
  323. return true;
  324. }
  325. string[] GetFormatArgs(string[] array)
  326. {
  327. string[] newArray = new string[array.Length - 1];
  328. for (int i = 1; i < array.Length; i++)
  329. {
  330. newArray[i - 1] = array[i];
  331. }
  332. return newArray;
  333. }
  334. }