local Character_Controller = {} local private = {} local IconPath = ConstAssetPathConfig.IconPath local RobotHeadImagePath = ConstAssetPathConfig.RobotHeadImagePath Character_Controller.UpOrder = { Common = 0, ChannelChat = 220, } -- 设置所有人头像&头像框 -- headUI 为头像模板UI -- portraitId 如果为空则使用当前穿戴的头像 -- frameId 如果为空则使用当前穿戴的头像框 这里支持传 nil 会显示默认头像框 -- [option] level 只有 >0 的时候才会显示等级 -- [option] acid: 可传可不传,如果逻辑判断已知是自己的头像或者是他人头像, -- 可直接调用 SetSelfPortraitAndFrame 或者 SetPortraitAndFrame不传acid。 -- 传入acid则无需判断当前头像所述 -- [option] isRaycastTarget 默认是true function Character_Controller.SetPortraitAndFrame(headUI, portraitId, frameId, level, acid, isRaycastTarget) -- 设置头像 private.SetPortrait(headUI, portraitId, acid == BattleDataGetter.GetAcID(), isRaycastTarget) -- 设置头像框 private.SetFrame(headUI, frameId) private.SetLevel(headUI, level) end -- 设置自己头像&头像框 -- level[option]: 只有 >0 的时候才会显示等级 function Character_Controller.SetSelfPortraitAndFrame(headUI, level, isRaycastTarget) private.SetPortrait(headUI, MDL.Character.GetCurWearPortrait(), true, isRaycastTarget) private.SetFrame(headUI, MDL.Character.GetCurWearFrame()) private.SetLevel(headUI, level) end -- img设置头像 function Character_Controller.SetImgPortrait(img, portraitId) local portraitData if portraitId > 0 then portraitData = DataSheetManager.HeadPortrait:GetDataByID(portraitId) end -- 头像数据没有找到 if not portraitData then for _, v in MDL.Character.GetPortraitsListIterator() do if v.Default then portraitData = v end end end if portraitData then if portraitData.HeroID > 0 then UIUtils.SetUICircleImageScaleRadiusAndOffset(img, 0.7, 0.15) else UIUtils.SetUICircleImageScaleRadiusAndOffset(img, 0, 0.05) end UIUtils.SetImageByAssetBundle(img, string.format(IconPath, portraitData.HeadResource)) end end function Character_Controller.SetHeadEmpty(headUI) if not headUI then return end UIUtils.SetActive(headUI.group_Level, false) UIUtils.SetActive(headUI.img_PlayerAvatarFrame, false) -- 关闭特效 headUI.UIEffect_Frame:StopUIEffect() UIUtils.SetActive(headUI.UIEffect_Frame.gameObject, false) headUI.obj_HeadState:SetState(1) end -- 设置等级 function private.SetLevel(headUI, level) if level and level > 0 then UIUtils.SetActive(headUI.group_Level, true) UIUtils.SetEmojiTextEmojiRatio(headUI.txt_Level, 1.8) local level, rank = MDL.Nobility.GetLevelAndNobility(level) UIUtils.SetLabel(headUI.txt_Level, CTL.ChannelChat.RankEmoji[rank] .. level) else UIUtils.SetActive(headUI.group_Level, false) end end -- 设置头像 function private.SetPortrait(headUI, portraitId, isSelf, isRaycastTarget) -- 设置头像之前先重置置灰状态 UIUtils.SetComponentGray(headUI.gameObject.transform, false) if portraitId == nil and isSelf then portraitId = MDL.Character.GetCurWearPortrait() end local portraitData = portraitId>0 and DataSheetManager.HeadPortrait:GetDataByID(portraitId) or nil -- 头像数据没有找到 if not portraitData then if isSelf then -- 如果是自身,则用当前展示的武将作为当前使用头像 local curShowHeroId = MDL.Player.GetCurShowId() for _, v in MDL.Character.GetPortraitsListIterator() do if v.HeroID == curShowHeroId then portraitData = v end end else -- 如果是他人,则用默认头像作为当前使用头像 for _, v in MDL.Character.GetPortraitsListIterator() do if v.Default then portraitData = v end end end end if portraitData then if portraitData.HeroID > 0 then UIUtils.SetUICircleImageScaleRadiusAndOffset(headUI.img_PlayerHead, 0.7, 0.15) else UIUtils.SetUICircleImageScaleRadiusAndOffset(headUI.img_PlayerHead, 0, 0.05) end headUI.obj_HeadState:SetState(0) UIUtils.SetImageByAssetBundle(headUI.img_PlayerHead, string.format(IconPath, portraitData.HeadResource)) end if isRaycastTarget == false then headUI.img_PlayerAvatarBg.targetGraphic.raycastTarget = false else headUI.img_PlayerAvatarBg.targetGraphic.raycastTarget = true end end -- 设置头像框 function private.SetFrame(headUI, frameId) local frameData = (frameId~= nil and frameId>0) and DataSheetManager.HeadBox:GetDataByID(frameId) -- 如果头像框数据没有找到,则使用默认头像框(默认头像框即头像框节点隐藏) if not frameData then for _, v in DataSheetManager.HeadBox:GetEnumerator() do if v.Default == 1 then frameData = v break end end end if frameData.Default == 1 then UIUtils.SetActive(headUI.img_PlayerAvatarFrame, false) headUI.UIEffect_Frame:StopUIEffect() UIUtils.SetActive(headUI.UIEffect_Frame.gameObject, false) else UIUtils.SetActive(headUI.img_PlayerAvatarFrame, true) UIUtils.SetImageByAssetBundle(headUI.img_PlayerAvatarFrame, string.format(IconPath, frameData.HeadResource)) if frameId == 100098 then headUI.img_PlayerAvatarFrame.transform:SetLocalScale(1.45, 1.45, 1.45) else headUI.img_PlayerAvatarFrame.transform:SetLocalScale(1, 1, 1) end if string.isNilOrEmpty(frameData.Effect) then headUI.UIEffect_Frame:StopUIEffect() UIUtils.SetActive(headUI.UIEffect_Frame.gameObject, false) else if CTL.HotFix.CanAssetLoad(frameData.Effect) then UIUtils.SetActive(headUI.UIEffect_Frame.gameObject, true) headUI.UIEffect_Frame:PlayUIEffect(frameData.Effect, -1) else headUI.UIEffect_Frame:StopUIEffect() UIUtils.SetActive(headUI.UIEffect_Frame.gameObject, false) end end end end function Character_Controller.GetDefaultHeadByGender(gender) for _, v in MDL.Character.GetPortraitsListIterator() do if v.Default and v.Gender == gender then return v.ID end end return 0 end function Character_Controller.GetInitialHeadListByGender(gender) local headList = {} for i, v in MDL.Character.GetPortraitsListIterator() do if v.GetType == MDL.Character.GetType.InitialHead and v.Gender == gender then table.insert(headList, v) end end return headList end function Character_Controller.CurWearHeadIsInitialHead() local portraitId = MDL.Character.GetCurWearPortrait() if portraitId == 0 then return true end local data = DataSheetManager.HeadPortrait:GetDataByID(portraitId) if (not data) or data.GetType == MDL.Character.GetType.InitialHead then return true end return false end function Character_Controller.GetDescribeByPortraitId(portraitId) local portraitData = DataSheetManager.HeadPortrait:GetDataByID(portraitId) if portraitData.GetType == MDL.Character.GetType.HeroActive or portraitData.GetType == MDL.Character.GetType.AwakenActive then local heroData = DataSheetManager.HeroData:GetDataByID(portraitData.HeroID) if heroData then return string.FormatByIdsId(Const_IDS[portraitData.Describe], UIUtils.GetLocalizedTxt(Const_IDS[heroData.NameIDS])) else logging.error(LTAG.ERROR, "头像头像框系统 : 没有找到对应武将 id = ", portraitData.HeroID, " 的武将数据") return "" end else return UIUtils.GetLocalizedTxt(Const_IDS[portraitData.Describe]) end end function Character_Controller.SetRobotHead(headUI) Character_Controller.SetHeadEmpty(headUI) UIUtils.SetComponentGray(headUI.gameObject.transform, false) headUI.obj_HeadState:SetState(0) UIUtils.SetUICircleImageScaleRadiusAndOffset(headUI.img_PlayerHead, 0.12, 0) UIUtils.SetImageByAssetBundle(headUI.img_PlayerHead, RobotHeadImagePath) end local RobotEnding = "-Train-Robot" function Character_Controller.IsRobot(acid) if string.isNilOrEmpty(acid) then return false end local s = string.find(acid, RobotEnding, 1, true) return s ~= nil end function Character_Controller.GetRobotName(acid) local array = string.split(acid, "-") return string.FormatByIdsId(Const_IDS.IDS_Robot_Name, array[1]) end return Character_Controller