Menu.lua.txt 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. local Menu = {}
  2. local MENU_ANIM_TYPE = {
  3. ["FLICKER"] = "FLICKER", -- 闪动
  4. ["MAGNIFY"] = "MAGNIFY" -- 放大
  5. }
  6. local CURRENT_ITEM_SCALE = 1.2
  7. local DEFAULT_ITEM_COUNT = 3
  8. local nCurrentItemIndex = 0
  9. local currentAnimType = MENU_ANIM_TYPE.FLICKER
  10. local function StopCurrentItemAnim()
  11. local rootPanel = Menu.rootPanel
  12. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  13. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  14. currentItem.transform.localScale = CS.UnityEngine.Vector3.one
  15. currentItem.transform:DOKill()
  16. end
  17. local function RefreshCurrentItemAnim()
  18. local rootPanel = Menu.rootPanel
  19. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  20. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  21. if currentAnimType == MENU_ANIM_TYPE.FLICKER then
  22. currentItem.transform.localScale = CS.UnityEngine.Vector3.one
  23. currentItem.transform:DOScale(CURRENT_ITEM_SCALE, 1):SetLoops(-1, CS.DG.Tweening.LoopType.Yoyo)
  24. return
  25. end
  26. if currentAnimType == MENU_ANIM_TYPE.MAGNIFY then
  27. currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1)
  28. return
  29. end
  30. end
  31. local function RefreshBtnBoxUI()
  32. local rootPanel = Menu.rootPanel
  33. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  34. local nBtnCount = panelBtnContent.transform.childCount
  35. local nShowBtnCount = GetCache("MENU_SHOW_ITEM_COUNT", DEFAULT_ITEM_COUNT)
  36. local nRefreshItemCount = (nBtnCount - nCurrentItemIndex) + math.floor((nShowBtnCount - DEFAULT_ITEM_COUNT) / 2)
  37. for i = 0, nRefreshItemCount, 1 do
  38. panelBtnContent.transform:GetChild(nBtnCount - 1):SetAsFirstSibling()
  39. end
  40. end
  41. local function RefreshCurrentItemUI()
  42. local rootPanel = Menu.rootPanel
  43. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  44. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  45. currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1)
  46. end
  47. local function SetPointClick()
  48. local rootPanel = Menu.rootPanel
  49. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  50. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  51. currentItem.transform:GetComponent("Selectable"):Select()
  52. end
  53. local function SelectPreItem()
  54. StopCurrentItemAnim()
  55. local rootPanel = Menu.rootPanel
  56. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  57. local nBtnCount = panelBtnContent.transform.childCount
  58. panelBtnContent.transform:GetChild(nBtnCount - 1):SetAsFirstSibling()
  59. if nCurrentItemIndex == 0 then
  60. nCurrentItemIndex = nBtnCount - 1
  61. else
  62. nCurrentItemIndex = nCurrentItemIndex - 1
  63. end
  64. RefreshCurrentItemAnim()
  65. SetPointClick()
  66. end
  67. local function SelectNextItem()
  68. StopCurrentItemAnim()
  69. local rootPanel = Menu.rootPanel
  70. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  71. local nBtnCount = panelBtnContent.transform.childCount
  72. panelBtnContent.transform:GetChild(0):SetAsLastSibling()
  73. if nCurrentItemIndex >= nBtnCount - 1 then
  74. nCurrentItemIndex = 0
  75. else
  76. nCurrentItemIndex = nCurrentItemIndex + 1
  77. end
  78. RefreshCurrentItemAnim()
  79. SetPointClick()
  80. end
  81. local function OnClickBtnItem(nClickItem, btnClickItem)
  82. if nClickItem == nCurrentItemIndex then
  83. local eventManager = require('Base/ZEventDispatchCenter.lua')
  84. eventManager:DispatchEvent(eventManager.EventType.COMMON_MENU_CLICK_BUTTON)
  85. return
  86. end
  87. local rootPanel = Menu.rootPanel
  88. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  89. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  90. local nClickItemIndex = btnClickItem.transform:GetSiblingIndex()
  91. local nCurrentItemIndex = currentItem.transform:GetSiblingIndex()
  92. if nClickItemIndex < nCurrentItemIndex then
  93. SelectPreItem()
  94. return
  95. end
  96. if nClickItemIndex > nCurrentItemIndex then
  97. SelectNextItem()
  98. return
  99. end
  100. end
  101. local function RefreshBtnItem()
  102. local rootPanel = Menu.rootPanel
  103. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  104. local nBtnCount = panelBtnContent.transform.childCount
  105. local uiHelper = require('Base/UIHelper.lua')
  106. for i = 0, nBtnCount - 1, 1 do
  107. local btnItem = panelBtnContent.transform:GetChild(i).gameObject
  108. btnItem.name = "Btn_" .. i
  109. uiHelper:AddClickEvent(panelBtnContent, btnItem.name, function ()
  110. OnClickBtnItem(i, btnItem)
  111. end)
  112. end
  113. end
  114. local function CheckMouseScroll()
  115. local bMenuScroll = GetCache("MENU_SCROLL")
  116. if not bMenuScroll then return end
  117. local Input = CS.UnityEngine.Input
  118. if Input.mouseScrollDelta.y > 0 then
  119. SelectPreItem()
  120. return
  121. end
  122. if Input.mouseScrollDelta.y < 0 then
  123. SelectNextItem()
  124. return
  125. end
  126. end
  127. local function CheckGesture()
  128. if CS.GetCommonActionData.LeftSlipEnumType then
  129. CS.GetCommonActionData.LeftSlipEnumType = false
  130. SelectNextItem()
  131. return
  132. end
  133. if CS.GetCommonActionData.RightSlipEnumType then
  134. CS.GetCommonActionData.RightSlipEnumType = false
  135. SelectPreItem()
  136. return
  137. end
  138. end
  139. local function CheckKeyDown()
  140. local Input = CS.UnityEngine.Input
  141. local KeyCode = CS.UnityEngine.KeyCode
  142. if Input.GetKeyDown(KeyCode.LeftArrow) then
  143. SelectPreItem()
  144. return
  145. end
  146. if Input.GetKeyDown(KeyCode.RightArrow) then
  147. SelectNextItem()
  148. return
  149. end
  150. end
  151. local function OnSelectMenu(selected)
  152. local szCurrentItemName = "Btn_" .. nCurrentItemIndex
  153. if selected.transform.name ~= szCurrentItemName then
  154. SetPointClick()
  155. return
  156. end
  157. local eventManager = require('Base/ZEventDispatchCenter.lua')
  158. eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected)
  159. end
  160. local function OnChangeSelectButton(lastSelectedObj, selected)
  161. if lastSelectedObj
  162. and not lastSelectedObj:Equals(nil)
  163. and lastSelectedObj.transform:CompareTag("CommonUtilsMenu")
  164. and lastSelectedObj.transform.name == "Btn_" .. nCurrentItemIndex
  165. then
  166. local rootPanel = Menu.rootPanel
  167. local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject
  168. local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject
  169. currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1)
  170. return
  171. end
  172. if lastSelectedObj
  173. and not lastSelectedObj:Equals(nil)
  174. and lastSelectedObj.transform:CompareTag("CommonUtilsMenu")
  175. and selected and selected.transform:CompareTag("CommonUtilsMenu")
  176. then
  177. lastSelectedObj.transform.localScale = CS.UnityEngine.Vector3.one
  178. local eventManager = require('Base/ZEventDispatchCenter.lua')
  179. eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected)
  180. return
  181. end
  182. if selected
  183. and not selected:Equals(nil)
  184. and selected.transform:CompareTag("CommonUtilsMenu")
  185. and selected.transform.name == "Btn_" .. nCurrentItemIndex then
  186. local eventManager = require('Base/ZEventDispatchCenter.lua')
  187. eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected)
  188. return
  189. end
  190. end
  191. local function RefreshUI()
  192. RefreshBtnItem()
  193. RefreshBtnBoxUI()
  194. RefreshCurrentItemUI()
  195. end
  196. local function InitData()
  197. end
  198. local function UnInitData()
  199. SetCache("MENU_SHOW_ITEM_COUNT", nil)
  200. SetCache("MENU_SCROLL", nil)
  201. end
  202. local function RegisterEvent()
  203. local eventManager = require('Base/ZEventDispatchCenter.lua')
  204. eventManager:RegisterEvent(eventManager.EventType.COMMON_SELECT_BUTTON, OnChangeSelectButton)
  205. eventManager:RegisterEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_SELECT_MENU, OnSelectMenu)
  206. end
  207. local function UnregisterEvent()
  208. local eventManager = require('Base/ZEventDispatchCenter.lua')
  209. eventManager:UnregisterEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_SELECT_MENU, OnSelectMenu)
  210. eventManager:UnregisterEvent(eventManager.EventType.COMMON_SELECT_BUTTON, OnChangeSelectButton)
  211. end
  212. function Menu.SetShowItemData(nShowItemDemo)
  213. SetCache("MENU_SHOW_ITEM_COUNT", nShowItemDemo)
  214. end
  215. function Menu.SetMenuScroll()
  216. SetCache("MENU_SCROLL", true)
  217. end
  218. function Menu.Awake(luaRoot)
  219. Menu.luaRoot = luaRoot
  220. Menu.rootPanel = luaRoot
  221. end
  222. function Menu.Start()
  223. InitData()
  224. RefreshUI()
  225. RegisterEvent()
  226. end
  227. function Menu.Update()
  228. CheckKeyDown()
  229. CheckMouseScroll()
  230. CheckGesture()
  231. end
  232. function Menu.OnDestroy()
  233. UnInitData()
  234. UnregisterEvent()
  235. CS.UnityEngine.GameObject.Destroy(Menu.rootPanel)
  236. end
  237. return Menu