-- <* -- @Author: Saber -- @Description: 圣物系统主界面 -- *> PsionicMainView = PsionicMainView or BaseClass(BaseView) local PsionicMainView = PsionicMainView local cos = math.cos local sin = math.sin local rad = math.rad local clamp = Mathf.Clamp function PsionicMainView:__init() self.base_file = "psionic" self.layout_file = "PsionicMainView" self.layer_name = "UI" self.destroy_imm = true self.use_background = G_USING_BG --全屏界面默认使用这个参数 self.hide_maincancas = true --全屏界面需要隐藏主UI self.append_to_ctl_queue = true --是否要添加进界面堆栈 self.ignore_use_anim = true self.use_show_anim = false self.use_hide_anim = false self.close_fog = true self.change_scene_close = true self.tab_index = PsionicConst.TabId.PArmor -- 页签索引 self.open_switch_index = PsionicConst.TabId.PArmor -- 跳转index self.main_vo = RoleManager.Instance.mainRoleInfo -- 界面列表 self.view_list = {} -- 装备栏位置列表 self.equip_con_list = {} self.main_equip_item_list = {} -- 圣物主页的圆盘上的装备节点 self.tab_equip_item_list = {} -- 圣物升级,洗练,觉醒等页签的左侧当tab节点用的装备节点 self.skill_con_list = {} self.skill_item_list = {} self.break_tab_list = {} self.break_tab_index = 1 -- 装备临时数据相关 self.equip_last_select_slot = nil -- 上次选中的装备slot self.skill_last_select_slot = nil -- 上次选中的技能slot self.ps_target_wash_uid = nil -- 目标选中的洗练装备uid self.cur_show_equip_goods_id = nil -- 当前查看的模型的装备id self.armor_item_list = {} self.equip_circle_radius = 0 self.advance_drag_y = 0 -- 模型信息数据相关 self.psionic_effect_res = nil -- 当前的圣环特效名 self.star_list = {} self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.is_in_guide = false self.load_callback = function () -- 保险起见,每次打开界面都要请求一次最新数据 self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13900) self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13910) self:LoadSuccess() self:AddEvent() self:UpdateTabRed() end self.open_callback = function ( ) self:OpenSuccess() end self.switch_callback = function(index) self:SwitchTab(index) end self.destroy_callback = function ( ) self:DestroySuccess() end end function PsionicMainView:Open(index, other_args) self.open_switch_index = index -- self.tab_index = index if index == PsionicConst.TabId.PSkill then self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot elseif index == PsionicConst.TabId.PWash then self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid -- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上 self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index else self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot end BaseView.Open(self) end function PsionicMainView:LoadSuccess() local nodes = { -- 右侧界面容器 "container", "right", -- 装备突破tab节点 "left/break_tab_con:obj", "left/equip_tab_con:obj", -- 左侧装备节点 "main/equip_con:obj", "main/equip_con/activate_effect_btn:obj", "main/equip_con/activate_effect_btn/activate_effect_btn_red:obj", -- 装备模型信息节点 "main/equip_info_con:obj", "main/equip_info_con/break_select_scroll:obj", "main/equip_info_con/break_select_scroll/Viewport/break_select_con", "main/equip_info_con/break_select_bg:obj", -- 装备突破背包容器 "main/equip_info_con/equip_name:tmp", "main/equip_info_con/equip_name_bg", -- 装备名称及背景板 "main/equip_info_con/equip_star_con", "main/equip_info_con/equip_model_con", -- 装备星数容器和模型容器 "main/equip_info_con/equip_effect_con", } self:GetChildren(nodes) -- 装备界面相关 -- 主页的圆盘上的装备和技能节点位置 for k = 1, 4 do self.equip_con_list[k] = self:GetChild("main/equip_con/left_equip_con" .. k) end for k = 1, 4 do self.skill_con_list[k] = self:GetChild("main/equip_con/right_equip_con" .. k) end local function select_callback(index) self:SwitchTab(index) end local function close_callback() self:Close() end self.tabWindowComponent = UITabWindow.New(self.transform, PsionicConst.TabData, select_callback, close_callback, self.background_wnd, nil, UITabWindow.SizeSmallHall, nil, nil, true) self.tabWindowComponent:SetTitleText("圣物") self.tabWindowComponent:ChangeShowFlag("Psionic") self:AddToStageHandler() end function PsionicMainView:AddEvent() local function click_event(target) if target == self.activate_effect_btn_obj then self.model:Fire(PsionicConst.OPEN_PSIONIC_EFFECT_EQUIP_VIEW, true) end end AddClickEvent(self.activate_effect_btn_obj, click_event) -- 圣物装备突破成功后,要重新更新圣物装备进阶界面信息 local function update_advance_view(slot) self:SelectMainRoleArmorItem(slot, true) end self:BindEvent(self.model, PsionicConst.UPDATE_ACVANCE_VIEW, update_advance_view) local function update_psionic_tab_red(tab_id) self:UpdateTabRed(tab_id) if tab_id and tab_id == PsionicConst.TabId.PArmor then self:UpdateEffectBtnRed() end end self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_psionic_tab_red) -- 特殊事件:在洗练界面中显示出所有的item节点,并取消对左侧装备的选中 local function on_show_all_item_in_refact_view() self:OnClickEquipItemCallback(nil) end self:BindEvent(self.model, PsionicConst.SHOW_ALL_ITEMS_IN_REFACTVIEW, on_show_all_item_in_refact_view) local function update_break_succeed(uid, slot) -- 圣物装备升星成功后,刷新当前选中的装备数据 uid:装备唯一id self.ps_target_wash_uid = uid self:UpdateBreakEquipItem(self.break_tab_index, true, true) end self:BindEvent(self.model, PsionicConst.UPDATE_EQUIP_BREAK_SUCCEED, update_break_succeed) local function play_effect(type) if type then local function call_back( ) self.showing_break_level_effect = false self.showing_break_equip_effect = false self.showing_skill_effect = false end if type == PsionicConst.EffectType.BreakLevel then -- 槽位等级突破成功 if not self.showing_break_level_effect then self:ClearUIEffect(self.equip_effect_con) self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back) self.showing_break_level_effect = true end elseif type == PsionicConst.EffectType.BreakEquip then -- 装备升星成功 if not self.showing_break_equip_effect then self:ClearUIEffect(self.equip_effect_con) self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -78, 0), 1, false, 1.5, nil, call_back) self.showing_break_equip_effect = true end elseif type == PsionicConst.EffectType.Skill then -- 技能升级成功 if not self.showing_skill_effect then self:ClearUIEffect(self.equip_effect_con) self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back) self.showing_skill_effect = true end end end end self:BindEvent(self.model, PsionicConst.PLAY_EFFECT, play_effect) local function update_equip_data() -- 当玩家当前的圣魂装备发生变动,则需要检测圣魂特效是否要变动 self.model:CheckPsionicEffectStage() -- goodsmodel的检测搬过来这边 end self:BindEvent(self.model, PsionicConst.UPDATE_PISIONIC_EQUIP_ARMOR, update_equip_data) local function onGuideTrigger() self:AddToStageHandler() end self:BindEvent(GlobalEventSystem, EventName.TRIGGER_GUIDE_TYPE, onGuideTrigger) end function PsionicMainView:OpenSuccess() -- 更新主角模型信息 -- self:UpdateRoleData() self:UpdateBreakTabItem() self:UpdateEffectBtnRed() self:SwitchTab(self.open_switch_index) end -- 针对界面隐藏时的回调处理 function PsionicMainView:HideChangeCall(show) if show then -- 修复从其他界面切换回圣物抽奖界面时模型动画的错误 if self.tab_index == PsionicConst.TabId.PDataDig and self.view_list[self.tab_index].is_loaded then -- 圣物寻宝 self.view_list[self.tab_index]:StartTransCGAlphaAnim(true) end end end function PsionicMainView:UpdateView() local bg_res = "default_bg_6" if self.tab_index == PsionicConst.TabId.PArmor then -- 数码装甲 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicArmorView.New(self.right) self.view_list[self.tab_index]:SetAnchoredPosition(-371, 0) -- 更新左侧装备和技能节点数据 self:UpdatePsionicEquipAndSkillData() end bg_res = "ps_lv_bg" -- self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PArmor) elseif self.tab_index == PsionicConst.TabId.PAdvance then -- 圣物进阶 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicAdvanceView.New(self.right) self.view_list[self.tab_index]:SetAnchoredPosition(-348.5, 0) end bg_res = "ps_advance_bg" -- 每次切换都要选中一件装备 self:SelectMainRoleArmorItem() -- 创建道具节点 self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PAdvance) elseif self.tab_index == PsionicConst.TabId.PBreak then -- 圣物突破 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicAdvanceBreakView.New(self.right) self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0) end bg_res = "ps_adv_break_bg" self.cur_selected_break_goodsVo = nil self:UpdateBreakEquipItem(self.break_tab_index, true) elseif self.tab_index == PsionicConst.TabId.PWash then -- 圣物洗练 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicWashView.New(self.right) self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0) end bg_res = "ps_advance_bg" -- 每次切换都要选中一件装备 self:SelectMainRoleArmorItem() -- 创建道具节点 self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PWash) elseif self.tab_index == PsionicConst.TabId.PSkill then -- 圣物觉醒 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicSkillView.New(self.right) self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0) end bg_res = "ps_advance_bg" -- 每次切换都要选中一个技能 self:SelectCircleItemSkill() -- 创建道具节点 self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PSkill) elseif self.tab_index == PsionicConst.TabId.PDataDig then -- 圣物寻宝 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicDrawView.New(self.container) end bg_res = "ps_draw_bg" elseif self.tab_index == PsionicConst.TabId.PExchange then -- 圣物兑换 if not self.view_list[self.tab_index] then self.view_list[self.tab_index] = PsionicExchangeView.New(self.container) end end self:PopUpChild(self.view_list[self.tab_index]) -- 寻宝界面不要打开物品飞入的表现 self.model:SetPsionicShowFlyGoods(self.tab_index ~= PsionicConst.TabId.PDataDig) self.tabWindowComponent:SetUIBack( { target = self, bg1 = GameResPath.GetViewBigBg(bg_res) }) -- 控制界面节点的开关 self:ShowPsionicInfoNodeCon() end function PsionicMainView:SwitchTab( index, other_args ) if index == PsionicConst.TabId.PAdvance or index == PsionicConst.TabId.PWash or index == PsionicConst.TabId.PSkill then -- 装甲进阶和重构 -- 如果当前一件圣物装备都没有穿戴则屏蔽该界面 local equip_list = self.goods_model:GetPsionicEquipList() if IsTableEmpty(equip_list) then Message.show("未穿戴圣物", "fault") self:SwitchTab(self.tab_index) return end -- 获取目标装备品质 local require_cfg = PsionicConst.RequireEquipColor[index] -- 切换需求前端配置 local has_advancable_equipment for k, v in pairs(equip_list) do -- 如果存在目标品质以上的圣物装备,则可以进入相关界面 if v.color >= require_cfg.color then has_advancable_equipment = true break end end if not has_advancable_equipment then local str = string.format("穿戴%s品质以上圣物才可进阶!", require_cfg.str) Message.show(str, "fault") self:SwitchTab(self.tab_index) return end elseif index == PsionicConst.TabId.PBreak then -- 圣物突破 local equip_list = self.goods_model:GetPsionicEquipList() local bag_list = self.model:GetPsionicBagData() local has_can_break_equip = false for k, v in ipairs(equip_list) do if v.next ~= 0 then -- 检查穿戴装备突破后的装备id不是0,下为背包装备的判断 has_can_break_equip = true break end end if not has_can_break_equip then for k, v in pairs(bag_list) do if v.next ~= 0 then has_can_break_equip = true break end end end if IsTableEmpty(equip_list) and IsTableEmpty(bag_list) or not has_can_break_equip then Message.show("未持有可进化的圣物", "fault") self:SwitchTab(self.tab_index) return end end if index == PsionicConst.TabId.PSkill then self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot elseif index == PsionicConst.TabId.PWash then self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid -- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上 self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index else self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot end self.tab_index = index self:DoOpenAni(self.tab_index) --设置页签索引值切换主页面 if self.tabWindowComponent then self.tabWindowComponent:SetTabBarIndex(self.tab_index) end self:UpdateView() end -- 创建装备升星页签节点 function PsionicMainView:UpdateBreakTabItem( ) local function break_tab_clickCallback(index) for k, v in ipairs(self.break_tab_list) do v:SetSelected(k == index) end self.break_tab_index = index self:UpdateBreakEquipItem(self.break_tab_index) end for i = 1, 5 do self.break_tab_list[i] = self.break_tab_list[i] or PsionicAdvanceBreakTabItem.New(self.break_tab_con) self.break_tab_list[i]:SetAnchoredPosition(0, - (i-1) * 55) self.break_tab_list[i]:SetData(i, break_tab_clickCallback) end break_tab_clickCallback(self.break_tab_index or 1) end -- 更新选中的圣物装备信息 function PsionicMainView:UpdateSelectedArmorInfo(goods_vo, star_effect) if goods_vo and not goods_vo.is_empty and (not self.cur_show_equip_goods_id or self.cur_show_equip_goods_id ~= goods_vo.goods_id)then -- 加载名称 self.equip_name_tmp.text = GoodsModel:getInstance():getGoodsName(goods_vo.type_id) local star_num = goods_vo.star -- 加载星数 for k, v in pairs(self.star_list) do v.gameObject:SetActive(false) end local offset_x = (self.equip_star_con.sizeDelta.x - star_num * 27) / 2 + 2 for i = 1, star_num do self.star_list[i] = self.star_list[i] or UiFactory.createChild(self.equip_star_con, UIType.Image2, "star" .. i) self.star_list[i].gameObject:SetActive(true) SetAnchoredPosition(self.star_list[i].transform, (i-1) * 27 + offset_x, 0) lua_resM:setImageSprite(self, self.star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1" , true) self:ClearUIEffect(self.star_list[i].transform) if star_effect and i == star_num then -- 需要星星动画时 self:AddUIEffect("ui_jinjiestar", self.star_list[i].transform, self.layer_name, Vector3(13, -12, 0), 1, false) end end -- 加载圣物模型 local model_data = PsionicConst.SlotModel[goods_vo.subtype] local res_data = { father_node = self, transform = self.equip_model_con, fashion_type = FuncOpenModel.TypeId.OtherGoods, raycast_size = Vector2(0,0), rotate = model_data.rotate, scale = model_data.scale, figure_id = model_data.model, position = model_data.pos, layer_name = self.layer_name, ui_model_type = UIModelCommon.ModelType.Model, } FuncOpenModel:getInstance():SetModelRes(res_data) self.cur_show_equip_goods_id = goods_vo.goods_id end end -- 更新圣物进化的背包节点 index:对应breaktab的index 1表示全部 2~5代表槽位(slot)4~7的映射 not_scroll_back:是否刷新时容器滚回初始位置 function PsionicMainView:UpdateBreakEquipItem(index, reload_equip_item, not_scroll_back) -- 加载背包道具数据 -- 是否需要定位到目标装备 local target_item_index = nil not_scroll_back = not_scroll_back or false if not self.break_equip_item or reload_equip_item then self.break_equip_item = self.model:GetPsionicBagData(true) -- 该方法会抽出背包圣物装备数据创建新表返回,true为按品质降序排序 for k = #self.break_equip_item, 1, -1 do -- 移除无法突破的装备 if self.break_equip_item[k].next == 0 and self.break_equip_item[k].goods_id ~= self.ps_target_wash_uid then table.remove(self.break_equip_item, k) end end end -- 预先加载穿戴装备(需置顶) local data = {} local equip_data = nil if index == 1 then for k, v in ipairs(self.break_equip_item) do data[#data+1] = v end -- 倒序插入已穿戴的装备 for i = 7, 3, -1 do equip_data = self.goods_model:GetPsionicEquipBySlot(i) if equip_data and equip_data.next ~= 0 then table.insert(data, 1, equip_data) end end else equip_data = self.goods_model:GetPsionicEquipBySlot(index + 2) if equip_data and equip_data.next ~= 0 then table.insert(data, equip_data) end -- 插入这个槽位的装备数据 for k, v in ipairs(self.break_equip_item) do if v.subtype == index + 2 then data[#data+1] = v end end end -- 获取目标装备index -- 新增修改:新增红点规则 每个槽位按照【当前穿戴】-【装备品质】-【装备星级】的排序规则的可突破的第一件装备给突破红点 -- 当前的装备列表顺序就是以【当前穿戴】-【装备品质】-【装备星级】的规则了,所以遇到条件满足的装备数据就将id加入其中 local slot_break_red_equip_list = {} -- 如果没有目标选中的index,则定位到数据列表最靠前的可以进化的装备上,下面这个列表缓存存在进化红点的装备index,视情况拿出第一个数据来定位 local temp_index_list = {} for k, v in ipairs(data) do if self.ps_target_wash_uid and v.goods_id == self.ps_target_wash_uid then target_item_index = k -- break end -- 获取缓存下来的突破红点 if not slot_break_red_equip_list[v.subtype] then local break_bool = self.model:GetPsionicBreakEquipRed(v.goods_id) if break_bool then slot_break_red_equip_list[v.subtype] = v.goods_id temp_index_list[#temp_index_list + 1] = k end end end -- 当前定位的节点是否是可突破的节点 local is_cur_target_index_in_index_list = false for k, v in ipairs(temp_index_list) do is_cur_target_index_in_index_list = is_cur_target_index_in_index_list or (target_item_index and target_item_index == v) end if not target_item_index or not is_cur_target_index_in_index_list then target_item_index = temp_index_list[1] or nil end -- 补全格子 local empty_data = {is_empty = true} local data_length = #data local need_full_num if data_length < 12 then need_full_num = 12 elseif data_length % 6 ~= 0 then -- 有空白格子,补全成无数据格子 need_full_num = math.ceil(data_length / 6) * 6 end if need_full_num then for i = data_length + 1, need_full_num do data[i] = empty_data end end local callback = function(data) -- 更新展示的装备信息和模型 self:UpdateSelectedArmorInfo(data, self.ps_target_wash_uid and true or false) -- 更新突破界面的材料需求 self:UpdateBreakViewData(data, self.ps_target_wash_uid and true or false, slot_break_red_equip_list) -- 更新选中 self.break_item_creator:IterateItems(function( item, i ) item:SetSelected(item.data.goods_id == data.goods_id) end) self.cur_selected_break_goodsVo = data end self.break_item_creator = self.break_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = data, item_con = self.break_select_con, scroll_view = self.break_select_scroll, item_class = PsionicArmorItem, item_width = 62, item_height = 62, start_x = 15.5, start_y = -13.5, space_x = 19, space_y = 15, create_frequency = 0.01, alignment = UnityEngine.TextAnchor.UpperLeft, is_scroll_back_on_update = not not_scroll_back, on_update_item = function(item, i, v) item:SetItemScale(0.795) item:SetBreakSlotRedEquipList(slot_break_red_equip_list) item:SetData(v, PsionicConst.ArmorItemFlag.Break, callback) if self.cur_selected_break_goodsVo then item:SetSelected(v.goods_id == self.cur_selected_break_goodsVo.goods_id) end end, final_callback = function() if not_scroll_back and target_item_index then self.break_item_creator:ScrollToItem(target_item_index, -50) end end, } self.break_item_creator:UpdateItems(info) callback(target_item_index and data[target_item_index] or (self.cur_selected_break_goodsVo or data[1])) -- 清空目标选中的uid self.ps_target_wash_uid = nil end -- 更新突破界面的信息 function PsionicMainView:UpdateBreakViewData(goods_vo, need_show_effect, slot_break_red_equip_list) if self.tab_index == PsionicConst.TabId.PBreak and self.view_list[self.tab_index] then self.view_list[self.tab_index]:SetData(goods_vo, need_show_effect, slot_break_red_equip_list) end end -- 加载玩家佩戴的圣物装备 function PsionicMainView:CheckPsionicEquipArmorItem(show_flag) if IsTableEmpty(self.tab_equip_item_list) then self:UpdatePsionicEquipArmorData(show_flag) else self:ChangePsionicEquipArmorShowFlag(show_flag) end end -- show_flag : 根据打开的页签不同,调整节点的点击回调逻辑 function PsionicMainView:UpdatePsionicEquipArmorData(show_flag) -- 加载4个位置的装备, -- 以位置做key,后面更新装备内容的时候直接通过装备位置来获取节点 local item local function equip_callback(slot) -- 更新进阶界面中的装备信息 self:SelectMainRoleArmorItem(slot) end local function skill_callback(slot) -- 更新进阶界面中的技能信息 self:SelectCircleItemSkill(slot) end for i = 1, 4 do item = self.tab_equip_item_list[i] if not item then -- item = PsionicArmorEquipItem.New(self.equip_con_list[i], nil, self.layer_name) item = PsionicArmorEquipItem.New(self.equip_tab_con, nil, self.layer_name) self.tab_equip_item_list[i] = item end item:SetAnchoredPosition(0, 179 - (i - 1) * 122) item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, show_flag, equip_callback, skill_callback) if show_flag == PsionicConst.TabId.PSkill then if self.skill_last_select_slot then item:SetSelected(i == (self.skill_last_select_slot - 3)) end else if self.equip_last_select_slot then item:SetSelected(i == (self.equip_last_select_slot - 3)) end end end end function PsionicMainView:ChangePsionicEquipArmorShowFlag(show_flag) for k, v in ipairs(self.tab_equip_item_list) do v:ChangeShowFlag(show_flag) end end -- 对左侧装备节点的点击的回调 function PsionicMainView:OnClickEquipItemCallback(slot) if IsTableEmpty(self.tab_equip_item_list) then return end slot = slot and slot - 3 or nil -- 槽位即道具子id,从4开始,需要-3映射 for k, v in pairs(self.tab_equip_item_list) do v:SetSelected(k == slot) end end -- 切换到进阶或重构界面时,需要自动选中一件装备 function PsionicMainView:SelectMainRoleArmorItem(slot, dont_refresh) local data local require_cfg = PsionicConst.RequireEquipColor[self.tab_index] local get_data = false -- print("Saber:PsionicMainView [396] self.tab_index: ",self.tab_index) local function check_color(data) if data and require_cfg.color ~= 0 then return data.color >= require_cfg.color end return data and true or false end if slot then -- 指定了槽位,就需要优先寻找槽位的装备 data = self.goods_model:GetPsionicEquipBySlot(slot) get_data = check_color(data) if get_data then self.equip_last_select_slot = slot end end if not get_data then if self.equip_last_select_slot then -- 存在上次选中的装备 data = self.goods_model:GetPsionicEquipBySlot(self.equip_last_select_slot) get_data = check_color(data) end if not get_data then -- 上次选中的装备不见了,则需要重新自动定位 for i = 1, 4 do data = self.goods_model:GetPsionicEquipBySlot(i + 3) -- 槽位即道具子id,从4开始,需要+3映射 get_data = check_color(data) if get_data then self.equip_last_select_slot = i + 3 break end end end end if get_data and data then if (self.tab_index == PsionicConst.TabId.PAdvance or self.tab_index == PsionicConst.TabId.PWash) and self.view_list[self.tab_index] then -- 装甲进阶 -- 重新设置装备进阶界面数据 self.view_list[self.tab_index]:SetData(data) end -- 触发一次对符合条件的节点的点击 if not dont_refresh or self.tab_index == PsionicConst.TabId.PWash then self:OnClickEquipItemCallback(self.equip_last_select_slot) end self:UpdateSelectedArmorInfo(data) end return data, self.equip_last_select_slot end -- 修改左侧装备的展示类型 -- function PsionicMainView:ChangeEquipShowFlag(flag) -- for k, v in pairs(self.armor_item_list) do -- v:SetEquipShowFlag(flag) -- end -- end -- 切换到技能界面时,需要自动选中一个已激活技能 function PsionicMainView:SelectCircleItemSkill(slot, dont_refresh) local skill_data, get_data if slot then -- 指定了槽位,就需要优先寻找槽位的装备的技能 skill_data = self.model:GetPsionicSlotData(slot) -- 存在技能数据,代表已经激活 if skill_data and skill_data.skill_lv > 0 then self.skill_last_select_slot = slot get_data = true end end if not get_data then if self.skill_last_select_slot then -- 存在上次选中的装备,查找这件装备上的技能 skill_data = self.model:GetPsionicSlotData(self.skill_last_select_slot) get_data = skill_data and skill_data.skill_lv > 0 end if not get_data then -- 上次选中的装备不见了,则需要重新自动定位,找到有技能的槽位 for i = 1, 4 do skill_data = self.model:GetPsionicSlotData(i + 3)-- 槽位即道具子id,从4开始,需要+3映射 if skill_data and skill_data.skill_lv > 0 then self.skill_last_select_slot = i + 3 get_data = true break end end end end if get_data then if self.tab_index == PsionicConst.TabId.PSkill and self.view_list[self.tab_index] then -- 技能觉醒界面 -- 重新设置技能觉醒界面需要展示的数据 self.view_list[self.tab_index]:SetData(skill_data) end if not dont_refresh then self:OnClickEquipItemCallback(self.skill_last_select_slot) end self:UpdateSelectedArmorInfo(self.goods_model:GetPsionicEquipBySlot(self.skill_last_select_slot)) end return skill_data, self.skill_last_select_slot end -- 调整主界面节点的显示情况 function PsionicMainView:ShowPsionicInfoNodeCon( ) local is_armor = self.tab_index == PsionicConst.TabId.PArmor local is_advance = self.tab_index == PsionicConst.TabId.PAdvance local is_wash = self.tab_index == PsionicConst.TabId.PWash local is_break = self.tab_index == PsionicConst.TabId.PBreak local is_skill = self.tab_index == PsionicConst.TabId.PSkill -- 是否展示主角模型界面 -- self:ShowRoleModelCon(is_armor) -- 是否展示穿戴装备节点 self:ShowEquipCon(is_armor, is_advance or is_wash or is_skill) -- 是否展示装备模型节点 self:ShowEquipInfoCon(is_break, is_advance or is_break or is_wash or is_skill) end -- 是否展示模型界面 -- function PsionicMainView:ShowRoleModelCon(show) -- if self.role_con_obj.activeSelf ~= show then -- self.role_con_obj:SetActive(show) -- end -- end -- 是否展示穿戴装备节点 function PsionicMainView:ShowEquipCon(is_armor, show_tab) -- 背包页签只展示圆盘上的装备节点,其他页签展示左侧tab节点 if self.equip_con_obj.activeSelf ~= is_armor then self.equip_con_obj:SetActive(is_armor) end if self.equip_tab_con_obj.activeSelf ~= show_tab then self.equip_tab_con_obj:SetActive(show_tab) end -- if self.equip_right_obj.activeSelf ~= is_armor then -- self.equip_right_obj:SetActive(is_armor) -- self.equip_title2_tmp.text = is_armor and "圣物技能" or "" -- end end -- 是否展示装备模型节点 function PsionicMainView:ShowEquipInfoCon(is_break, show) if self.equip_info_con_obj.activeSelf ~= show then self.equip_info_con_obj:SetActive(show) if not show then -- 隐藏特效 self.showing_break_level_effect = false self.showing_break_equip_effect = false self.showing_skill_effect = false self:ClearUIEffect(self.equip_effect_con) end end -- 突破界面需要展示背包滚动容器和容器背景,并调整模型位置 if self.break_select_bg_obj.activeSelf ~= is_break then self.break_select_bg_obj:SetActive(is_break) self.break_select_scroll_obj:SetActive(is_break) self.break_tab_con_obj:SetActive(is_break) end SetAnchoredPositionY(self.equip_model_con, is_break and -120 or -200) SetAnchoredPositionY(self.equip_effect_con, is_break and 65 or 25) end -- 显示左侧进阶装备列表节点 function PsionicMainView:ShowPsionicArmorListCon( ) -- local bool = self.tab_index == PsionicConst.TabId.PAdvance or self.tab_index == PsionicConst.TabId.PWash or self.tab_index == PsionicConst.TabId.PSkill -- if self.advance_con_obj.activeSelf ~= bool then -- 显示状态不同,则切换显示状态 -- if not self.adv_node_tween_id then -- self.advance_con_obj:SetActive(bool) -- end -- end end -- 加载玩家佩戴的圣物技能 function PsionicMainView:UpdatePsionicEquipAndSkillData( ) -- 加载4个位置的技能, local e_item, s_item for i = 1, 4 do -- 装备节点 e_item = self.main_equip_item_list[i] if not e_item then e_item = PsionicArmorEquipItem.New(self.equip_con_list[i]) self.main_equip_item_list[i] = e_item end e_item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, PsionicConst.TabId.PArmor) -- 技能节点 s_item = self.skill_item_list[i] if not s_item then s_item = PsionicSkillEquipItem.New(self.skill_con_list[i]) self.skill_item_list[i] = s_item end s_item:SetData(i) end end -- 更新页签红点 function PsionicMainView:UpdateTabRed(tab_id) if tab_id then self.tabWindowComponent:ShowRedPoint(tab_id, self.model:GetPsionicRedDotCache(tab_id)) else for k, v in pairs(PsionicConst.TabData) do local bool = self.model:GetPsionicRedDotCache(v.id) -- print("Saber:PsionicMainView [658] bool, v.id: ",bool, v.id) self.tabWindowComponent:ShowRedPoint(v.id, bool) end end end -- 更新圣环按钮红点 function PsionicMainView:UpdateEffectBtnRed( ) self.activate_effect_btn_red_obj:SetActive(self.model:GetPsionicEffectBtnRed()) end function PsionicMainView:DestroySuccess( ) if self.tabWindowComponent then self.tabWindowComponent:DeleteMe() self.tabWindowComponent = nil end for k, v in pairs(self.view_list) do v:DeleteMe() v = nil end self.view_list = nil for k, v in pairs(self.tab_equip_item_list) do v:DeleteMe() v = nil end self.tab_equip_item_list = nil for k, v in pairs(self.armor_item_list) do v:DeleteMe() v = nil end self.armor_item_list = nil for k, v in pairs(self.main_equip_item_list) do v:DeleteMe() v = nil end self.main_equip_item_list = {} for k, v in pairs(self.skill_item_list) do v:DeleteMe() v = nil end self.skill_item_list = nil for k, v in pairs(self.break_tab_list) do v:DeleteMe() v = nil end self.break_tab_list = nil self:ClearUIEffect(self.equip_effect_con) self.model:SetPsionicShowFlyGoods(true) Runner.Instance:RemoveRunObj(self) end function PsionicMainView:Close() --完成引导 self:CloseGuide() BaseView.Close(self) end --检测点击屏幕 function PsionicMainView:Update() if self.is_in_guide then local is_click = false if Input.touchCount > 0 then is_click = true else if Input.GetMouseButtonDown(0) then is_click = true end end if is_click then self.is_in_guide = false Runner.Instance:RemoveRunObj(self) self:CloseGuide() end end end function PsionicMainView:AddToStageHandler() local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5) if not helpVo then return end local help_type = helpVo.help_type if (help_type == HelpType.TYPE_PSIONIC) then local step = helpVo.step local button = false if (help_type == HelpType.TYPE_PSIONIC) and step == 5 then button = self.skill_con_list[1] end if button then local function call_back() end GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, button.transform.parent.transform, call_back, helpVo, self.layout_file) self.is_in_guide = true Runner.Instance:AddRunObj(self, 1) end else GlobalEventSystem:Fire(EventName.CLOSE_GUIDE_PROMPT_VIEW) end end function PsionicMainView:CloseGuide() local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5) if helpVo then GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo) end end