HomeViewChallengeOption.cs 15 KB

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