local Menu = {} local MENU_ANIM_TYPE = { ["FLICKER"] = "FLICKER", -- 闪动 ["MAGNIFY"] = "MAGNIFY" -- 放大 } local CURRENT_ITEM_SCALE = 1.2 local DEFAULT_ITEM_COUNT = 3 local nCurrentItemIndex = 0 local currentAnimType = MENU_ANIM_TYPE.FLICKER local function StopCurrentItemAnim() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject currentItem.transform.localScale = CS.UnityEngine.Vector3.one currentItem.transform:DOKill() end local function RefreshCurrentItemAnim() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject if currentAnimType == MENU_ANIM_TYPE.FLICKER then currentItem.transform.localScale = CS.UnityEngine.Vector3.one currentItem.transform:DOScale(CURRENT_ITEM_SCALE, 1):SetLoops(-1, CS.DG.Tweening.LoopType.Yoyo) return end if currentAnimType == MENU_ANIM_TYPE.MAGNIFY then currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1) return end end local function RefreshBtnBoxUI() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local nBtnCount = panelBtnContent.transform.childCount local nShowBtnCount = GetCache("MENU_SHOW_ITEM_COUNT", DEFAULT_ITEM_COUNT) local nRefreshItemCount = (nBtnCount - nCurrentItemIndex) + math.floor((nShowBtnCount - DEFAULT_ITEM_COUNT) / 2) for i = 0, nRefreshItemCount, 1 do panelBtnContent.transform:GetChild(nBtnCount - 1):SetAsFirstSibling() end end local function RefreshCurrentItemUI() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1) end local function SetPointClick() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject currentItem.transform:GetComponent("Selectable"):Select() end local function SelectPreItem() StopCurrentItemAnim() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local nBtnCount = panelBtnContent.transform.childCount panelBtnContent.transform:GetChild(nBtnCount - 1):SetAsFirstSibling() if nCurrentItemIndex == 0 then nCurrentItemIndex = nBtnCount - 1 else nCurrentItemIndex = nCurrentItemIndex - 1 end RefreshCurrentItemAnim() SetPointClick() end local function SelectNextItem() StopCurrentItemAnim() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local nBtnCount = panelBtnContent.transform.childCount panelBtnContent.transform:GetChild(0):SetAsLastSibling() if nCurrentItemIndex >= nBtnCount - 1 then nCurrentItemIndex = 0 else nCurrentItemIndex = nCurrentItemIndex + 1 end RefreshCurrentItemAnim() SetPointClick() end local function OnClickBtnItem(nClickItem, btnClickItem) if nClickItem == nCurrentItemIndex then local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:DispatchEvent(eventManager.EventType.COMMON_MENU_CLICK_BUTTON) return end local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject local nClickItemIndex = btnClickItem.transform:GetSiblingIndex() local nCurrentItemIndex = currentItem.transform:GetSiblingIndex() if nClickItemIndex < nCurrentItemIndex then SelectPreItem() return end if nClickItemIndex > nCurrentItemIndex then SelectNextItem() return end end local function RefreshBtnItem() local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local nBtnCount = panelBtnContent.transform.childCount local uiHelper = require('Base/UIHelper.lua') for i = 0, nBtnCount - 1, 1 do local btnItem = panelBtnContent.transform:GetChild(i).gameObject btnItem.name = "Btn_" .. i uiHelper:AddClickEvent(panelBtnContent, btnItem.name, function () OnClickBtnItem(i, btnItem) end) end end local function CheckMouseScroll() local bMenuScroll = GetCache("MENU_SCROLL") if not bMenuScroll then return end local Input = CS.UnityEngine.Input if Input.mouseScrollDelta.y > 0 then SelectPreItem() return end if Input.mouseScrollDelta.y < 0 then SelectNextItem() return end end local function CheckGesture() if CS.GetCommonActionData.LeftSlipEnumType then CS.GetCommonActionData.LeftSlipEnumType = false SelectNextItem() return end if CS.GetCommonActionData.RightSlipEnumType then CS.GetCommonActionData.RightSlipEnumType = false SelectPreItem() return end end local function CheckKeyDown() local Input = CS.UnityEngine.Input local KeyCode = CS.UnityEngine.KeyCode if Input.GetKeyDown(KeyCode.LeftArrow) then SelectPreItem() return end if Input.GetKeyDown(KeyCode.RightArrow) then SelectNextItem() return end end local function OnSelectMenu(selected) local szCurrentItemName = "Btn_" .. nCurrentItemIndex if selected.transform.name ~= szCurrentItemName then SetPointClick() return end local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected) end local function OnChangeSelectButton(lastSelectedObj, selected) if lastSelectedObj and not lastSelectedObj:Equals(nil) and lastSelectedObj.transform:CompareTag("CommonUtilsMenu") and lastSelectedObj.transform.name == "Btn_" .. nCurrentItemIndex then local rootPanel = Menu.rootPanel local panelBtnContent = rootPanel.transform:Find("Panel_BtnContent").gameObject local currentItem = panelBtnContent.transform:Find("Btn_" .. nCurrentItemIndex).gameObject currentItem.transform.localScale = CS.UnityEngine.Vector3(CURRENT_ITEM_SCALE, CURRENT_ITEM_SCALE, 1) return end if lastSelectedObj and not lastSelectedObj:Equals(nil) and lastSelectedObj.transform:CompareTag("CommonUtilsMenu") and selected and selected.transform:CompareTag("CommonUtilsMenu") then lastSelectedObj.transform.localScale = CS.UnityEngine.Vector3.one local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected) return end if selected and not selected:Equals(nil) and selected.transform:CompareTag("CommonUtilsMenu") and selected.transform.name == "Btn_" .. nCurrentItemIndex then local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:DispatchEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_ANIM, selected) return end end local function RefreshUI() RefreshBtnItem() RefreshBtnBoxUI() RefreshCurrentItemUI() end local function InitData() end local function UnInitData() SetCache("MENU_SHOW_ITEM_COUNT", nil) SetCache("MENU_SCROLL", nil) end local function RegisterEvent() local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:RegisterEvent(eventManager.EventType.COMMON_SELECT_BUTTON, OnChangeSelectButton) eventManager:RegisterEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_SELECT_MENU, OnSelectMenu) end local function UnregisterEvent() local eventManager = require('Base/ZEventDispatchCenter.lua') eventManager:UnregisterEvent(eventManager.EventType.COMMON_UI_NAVIGATOR_SELECT_MENU, OnSelectMenu) eventManager:UnregisterEvent(eventManager.EventType.COMMON_SELECT_BUTTON, OnChangeSelectButton) end function Menu.SetShowItemData(nShowItemDemo) SetCache("MENU_SHOW_ITEM_COUNT", nShowItemDemo) end function Menu.SetMenuScroll() SetCache("MENU_SCROLL", true) end function Menu.Awake(luaRoot) Menu.luaRoot = luaRoot Menu.rootPanel = luaRoot end function Menu.Start() InitData() RefreshUI() RegisterEvent() end function Menu.Update() CheckKeyDown() CheckMouseScroll() CheckGesture() end function Menu.OnDestroy() UnInitData() UnregisterEvent() CS.UnityEngine.GameObject.Destroy(Menu.rootPanel) end return Menu