HeadRoleItem = HeadRoleItem or BaseClass(BaseItem) function HeadRoleItem:__init(parent_wnd, prefab_asset, layer_name) self.base_file = "uiComponent" self.layout_file = "HeadRoleItem" self.is_delay_callback = true -- self.use_local_view = true self.vo = nil self.parent = parent_wnd self.layer_name = layer_name self.gray_mat = ShaderTools.gray_mat self.show_sex = false self.show_sex_type = 1 -- 性别展示类型 1:左下角带底图 2:左上角无底图 -- 不同背景图片下的背景坐标 self.bg_offsets = { [1] = {x = 0, y = 0}, [2] = {x = 2, y = -2.5}, [3] = {x = 0, y = 0}, } self.bg_sizeDelta = { [1] = {x = 165, y = 165}, [2] = {x = 176, y = 176}, [3] = {x = 165, y = 165}, } self.duration = 0.1 self.long_click_time = 1500 -- 长按判定时间(毫秒) self:Load() end function HeadRoleItem:__delete( ) if self.bind_wait_for_protocal then GlobalEventSystem:UnBind(self.bind_wait_for_protocal) self.bind_wait_for_protocal = nil end if self.long_click_timer_id then GlobalTimerQuest:CancelQuest(self.long_click_timer_id) self.long_click_timer_id = nil end end function HeadRoleItem:Load_callback() local node = { "head", "head/bg:obj:imgex", "head/dressBoard:img:obj", "head/icon:raw", "head/effect", "head/sex_bg:obj", "head/sex_icon:obj:img", "head/lv_bg:obj:img", "head/lv_bg/lv:tmp", "head/career_icon:obj:img",--职业图标 } self:GetChildren(node) self.head_size_x = self.head.sizeDelta.x self.head_size_y = self.head.sizeDelta.y local function onClickBtnHandler(target, x, y) if self.vo and not self.long_click_call_back then self:OnClickFunc( x, y ) end end AddClickEvent(self.gameObject, onClickBtnHandler, nil, false) local function touch_end_func(target,x,y) if not self.long_click_call_back then return end local cur_time = TimeUtil:getClientTimeMs( ) if self.vo and cur_time - self.click_start_time <= self.long_click_time then self:OnClickFunc( x, y ) end if self.long_click_timer_id then GlobalTimerQuest:CancelQuest(self.long_click_timer_id) self.long_click_timer_id = nil end end local function touch_begin_func(target,x,y) if not self.long_click_call_back then return end self.click_start_time = TimeUtil:getClientTimeMs( ) local function clockFun() local cur_time = TimeUtil:getClientTimeMs( ) if cur_time - self.click_start_time > self.long_click_time then if self.long_click_call_back then self.long_click_call_back(self.vo) end if self.long_click_timer_id then GlobalTimerQuest:CancelQuest(self.long_click_timer_id) self.long_click_timer_id = nil end end end if not self.long_click_timer_id then self.long_click_timer_id = GlobalTimerQuest:AddPeriodQuest(clockFun, self.duration, -1) end clockFun() end AddDownEvent(self.gameObject, touch_begin_func) AddUpEvent(self.gameObject, touch_end_func) if self.need_refresh then self:UpdateView() end if self.gray_cache ~= nil then self:SetGray(self.gray_cache) end if self.need_effect then self:SetEffect(self.effect_name, self.eff_layer_name, self.eff_scale, self.mask_id) end if self.career_icon_cache ~= nil then self:SetCareerIconVisible(self.career_icon_cache) end end --[[ 2019年11月29日修改 : 通用头像的参数改为一个table,参数名不变 data = { vo, -- 玩家头像的具体参数 show_tip, -- 是否可以查看玩家数据,默认可以 custom_callback, -- 自己传callback use_bg, -- 使用的背景图片的类型,如果自己加了新样式在记得上面的self.bg_offsets中添加自己的新背景图片坐标 } vo范例 vo = { id = RoleManager.Instance.mainRoleInfo.role_id, server_id = RoleManager.Instance.mainRoleInfo.server_id, career = RoleManager.Instance.mainRoleInfo.career, sex = RoleManager.Instance.mainRoleInfo.sex, turn = RoleManager.Instance.mainRoleInfo.turn, picture_ver = RoleManager.Instance.mainRoleInfo.picture_ver, --不支持自定义头像,此字段废弃 picture = RoleManager.Instance.mainRoleInfo.picture, --不支持自定义头像,此字段废弃 profile_photo_id = RoleManager.Instance.mainRoleInfo.profile_photo_id, dress_board_id = ChatDressModel:getInstance().use_dress_list[2],--头像框id,默认为0(无头像框) level = RoleManager.Instance.mainRoleInfo.level, do_not_click = true,--不可点击 empty_head = false, -- 是否是空数据头像 not_show_level = true } ]] function HeadRoleItem:SetData(data) -- data.vo = data.vo -- data.vo.turn = data.vo.turn or 0 local temp_vo = {} if data and data.vo then temp_vo = data.vo elseif data then temp_vo = data end self.vo = temp_vo -- self.vo.turn = data.vo and data.vo.turn or 0 -- 这两个暂时废弃 self:SetSomeInfo(data) self:UpdateView() end --[[ 通过角色id展示头像,数据格式和SetData一样,module_id填自己的标记id,防混 --]] function HeadRoleItem:SetShowByRoleId( data ) local temp_vo = {} if data and data.vo then temp_vo = data.vo elseif data then temp_vo = data end self.vo = temp_vo self.module_id = data.module_id or 0 ------------------------- self:SetSomeInfo(data) if (self.vo.role_id or self.vo.id) then self.wait_for_protocal = true ------------------------- if not self.bind_wait_for_protocal then local function ANS_OTHER_HEAD_INFO( head_data ) if self._use_delete_method then return end if head_data.mod ~= self.module_id then return end ------------------------- self.vo = self.vo or {} for k,v in pairs(head_data) do self.vo[k] = v end self:UpdateView() ------------------------- if self.bind_wait_for_protocal then GlobalEventSystem:UnBind(self.bind_wait_for_protocal) self.bind_wait_for_protocal = nil end self.wait_for_protocal = nil end self.bind_wait_for_protocal = GlobalEventSystem:Bind(EventName.ANS_OTHER_HEAD_INFO,ANS_OTHER_HEAD_INFO) GlobalEventSystem:Fire( EventName.REQ_OTHER_HEAD_INFO, self.module_id, (self.vo.role_id or self.vo.id) ) end else Message.show("缺少角色信息~") end end function HeadRoleItem:SetSomeInfo( data ) self.bg_size = data.bg_size self.icon_size = data.icon_size ---------------- self.show_tip = data.show_tip == nil and true or data.show_tip --默认弹提示 self.not_show_level = data.not_show_level self.do_not_click = data.do_not_click or (self.vo and self.vo.do_not_click) self.custom_callback = data.custom_callback -- self.use_bg = data.use_bg or (self.vo and self.vo.use_bg) or 1 -- 使用的背景样式(1为白底渐变外框正方形) self.use_bg = 3--20201026头像背景写死为3 end function HeadRoleItem:UpdateView() if not self.vo then return end if not self.is_loaded then self.need_refresh = true return end local vo = self.vo self.bg_imgex.raycastTarget = not self.do_not_click and true or false -- 选择好需要使用的背景图 lua_resM:setImageSprite(self, self.bg_imgex, "uiComponent_asset", "pw_ckxx_0"..self.use_bg) SetAnchoredPosition(self.bg, self.bg_offsets[self.use_bg].x, self.bg_offsets[self.use_bg].y) SetSizeDeltaX(self.bg, self.bg_sizeDelta[self.use_bg].x) SetSizeDeltaY(self.bg, self.bg_sizeDelta[self.use_bg].y) -- 暂时废弃这段逻辑 -- if self.bg_size then -- if self.use_bg == 1 then -- self.bg.sizeDelta = self.bg_size -- elseif self.use_bg == 2 then -- self.bg2.sizeDelta = self.bg_size -- end -- end -- if self.icon_size then -- self.icon.sizeDelta = self.icon_size -- end ------------------ -- print("Saber:HeadRoleItem [start:127] vo ------------------------------------------") -- PrintTable(vo) --头像 if self.vo.empty_head then self.icon.gameObject:SetActive(false) self.dressBoard_obj:SetActive(false) else self.icon.gameObject:SetActive(true) -- if vo.career and vo.sex and vo.turn and vo.career ~= 0 and vo.sex ~= 0 then CustomRoleHead:getInstance():Create(self, self.icon_raw, vo.id or vo.role_id, vo.career, vo.sex, vo.turn, nil, vo.picture_ver, vo.picture, false, vo.profile_photo_id) -- end --头像框 if (vo.dress_board_id and vo.dress_board_id ~=0 and vo.dress_board_id ~= 420001) or (vo.dress_id and vo.dress_id ~=0 and vo.dress_id ~= 420001) then local id = vo.dress_board_id or vo.dress_id lua_resM:setOutsideImageSprite(self,self.dressBoard_img,GameResPath.GetChatDressIcon(id),false) self.dressBoard_obj:SetActive(true) else -- lua_resM:setImageSprite(self, self.dressBoard_img, "uiComponent_asset","com_empty", false) self.dressBoard_obj:SetActive(false) end --职业 (策划说先屏蔽了 2020.10.21 by msh) self.career_icon_obj:SetActive(false) -- if vo.career and vo.career ~= 0 then -- self.career_icon_obj:SetActive(true) -- lua_resM:setImageSprite(self, self.career_icon_img, "common_asset","common_career_"..vo.career) -- else -- self.career_icon_obj:SetActive(false) -- end if self.custom_callback then self.custom_callback() end end --设置大小 self:SetItemSize() self:SetSexConShow(self.show_sex, self.show_sex_type) if RoleManager and RoleManager.Instance and RoleManager.Instance.mainRoleInfo.level < Config.Modulesub["110@2"].open_lv then if self.lv_bg_obj.activeSelf then self.lv_bg_obj:SetActive(false) end self.lv_tmp.text = "" else self.lv_bg_obj:SetActive(vo.level and vo.level~=0 and true or false) self.lv_tmp.text = vo.level or "" end --AI管家:不显示AI管家的等级 if vo.id == 1 then self.lv_tmp.text = "" end if self.not_show_level then self.lv_tmp.text = "" self.lv_bg_obj:SetActive(false) end end function HeadRoleItem:SetGray(bool) if self.is_loaded then local mat = bool and self.gray_mat or nil self.icon_raw.material = mat self.dressBoard_img.material = mat SetImageGray(self.lv_bg_img,bool) SetImageGray(self.career_icon_img,bool) SetImageGray(self.bg_imgex,bool) else self.gray_cache = bool end end function HeadRoleItem:SetItemSize(x, y) self.now_size_x = tonumber(x) or self.now_size_x or self.head_size_x self.now_size_y = tonumber(y) or self.now_size_y or self.head_size_y if self.is_loaded then local x_ratio = self.now_size_x / self.head_size_x local y_ratio = self.now_size_y / self.head_size_y self.head.localScale = Vector2(x_ratio, y_ratio) end end function HeadRoleItem:SetSexConShow(show, show_type) self.show_sex = show or self.show_sex self.show_sex_type = show_type or self.show_sex_type if self.is_loaded then if show then self.sex_icon_obj:SetActive(true) if self.show_sex_type == 1 then self.sex_bg_obj:SetActive(true) SetAnchoredPositionY(self.sex_icon, -55) elseif self.show_sex_type == 2 then self.sex_bg_obj:SetActive(false) SetAnchoredPositionY(self.sex_icon, 58) SetLocalScale(self.sex_icon, 0.8, 0.8, 0.8) end lua_resM:setImageSprite(self, self.sex_icon_img, "uiComponent_asset", "headrole_sex_"..(self.vo and self.vo.sex or 1), true) else self.sex_icon_obj:SetActive(false) self.sex_bg_obj:SetActive(false) end end end function HeadRoleItem:SetEffect(effect_name, layer_name, scale, mask_id) self.effect_name = effect_name self.eff_layer_name = layer_name self.eff_scale = scale self.mask_id = mask_id if self.is_loaded then local function load_end_func() end --没有传mask_id而且要显示特效的情况才去获取mask_id if not self.mask_id then local p_wnd = self.parent repeat p_wnd = p_wnd.parent if p_wnd and p_wnd.parent then local rect = p_wnd.parent:GetComponent(typeof(UnityEngine.UI.ScrollRect)) if rect then if p_wnd:GetComponent("EffectMask") then self.mask_id = 1 else local image = p_wnd:GetComponent("Image") if image then self.mask_id = self:RegisterMask(image) end end end end until not p_wnd or self.mask_id end self:AddUIEffect(effect_name, self.effect, layer_name or "UI", nil, scale or 1, true, nil, self.mask_id, nil, load_end_func) self.need_effect = false else self.need_effect = true end end function HeadRoleItem:SetCareerIconVisible( flag ) if not self.is_loaded then self.career_icon_cache = flag return end if self.career_icon_obj then self.career_icon_obj:SetActive(flag) end end function HeadRoleItem:SetClickCall( call_back ) self.call_back = call_back end -- 设置长按事件 function HeadRoleItem:SetLongClickCall( call_back ) self.long_click_call_back = call_back end -- 单击轻点 function HeadRoleItem:OnClickFunc( x, y ) if self.do_not_click then return end if self.call_back then self.call_back(self.vo) return end local role_id = self.vo.id or self.vo.role_id --AI管家:role_id==1是AI管家的情况,这种情况不能打开交互面板 if self.show_tip and role_id ~= RoleManager.Instance.mainRoleInfo.role_id and role_id ~= 1 then -- print("-------self.vo.server_id ~= RoleManager.Instance.mainRoleInfo.server_id",role_id , RoleManager.Instance.mainRoleInfo.server_id) -- if self.vo.server_id and self.vo.server_id ~= RoleManager.Instance.mainRoleInfo.server_id then -- Message.show("无法查看跨服玩家信息") -- return -- end if RoleManager.Instance.mainRoleInfo.level < Config.Modulesub["110@2"].open_lv then Message.show("查看功能未开放") return end --请求协议获取对方信息 if role_id then SocialityModel:getInstance():Fire(SocialityModel.REQUEST_OTHER_INFO, role_id, x, y, self.vo.info) end end end