local EntityHeadUIModule = {} local private = {} local IMAGE_WORLDBOSS_HELP = ConstAssetPathConfig.IMAGE_WORLDBOSS_HELP local IMAGE_FIGHTTHRONE_FLAG = ConstAssetPathConfig.IMAGE_FIGHTTHRONE_FLAG local IMAGE_DRAGONARTERYTOTEM_FLAG = ConstAssetPathConfig.IMAGE_DRAGONARTERYTOTEM_FLAG local IMAGE_DRAGONARTERYTOTEM_GENERAL = ConstAssetPathConfig.IMAGE_DRAGONARTERYTOTEM_GENERAL local IMAGE_GUILD_WAR = ConstAssetPathConfig.IMAGE_GUILD_WAR local IMAGE_FIGHTTHRONE_PIECE = ConstAssetPathConfig.IMAGE_FIGHTTHRONE_PIECE local IMAGE_WORLDBOSS_NO1 = ConstAssetPathConfig.IMAGE_WORLDBOSS_NO1 local EFFECT_RIVAL = ConstAssetPathConfig.EFFECT_RIVAL local EFFECT_RIVAL_NOT_CH = ConstAssetPathConfig.EffPath local EFFECT_FOUR_COUNTRY_CROWN = ConstAssetPathConfig.EFFECT_FOUR_COUNTRY_CROWN local EFFECT_WORLDBOSS_NO1 = ConstAssetPathConfig.EFFECT_WORLDBOSS_NO1 local EFFECT_DRAGONARTERY_TOTEM = ConstAssetPathConfig.EFFECT_DRAGONARTERY_TOTEM --大小有意义,值越接近ModelName该UI越靠近名字 EntityHeadUIModule.HeadUIType = { Min = -10, --最小值,新增类型时需要更新 ChangAnVehicle = -9, --长安战车 ChangAnCarState = -8, --长安冲车 ChangAnSiegeDefendTowerState = -6, --长安守方战塔状态 ChangAnSiegeAttackTowerState = -7, --长安攻方战塔状态 Country = -5, --国家,在名字左边 CDTimer = -4,--倒计时显示(目前用于国战--悬赏任务) FightThronePiece = -3, --大乱斗碎片,在名字左边 WorldBossHelp = -2, --世界boss求助,在名字左边 WorldBossNo1 = -1, --世界boss排名第一,在名字左边 None = 0, ModelName = 1, Guild = 2, --势力 Title = 3, --称号 Rival = 4, --仇敌 RivalNotChinese = 5, --非中文仇敌 GuildWar = 6, --势力战 FightThroneFlag = 7, --大乱斗令旗 DragonArteryTotem = 9, --龙脉图腾 DragonArteryGeneral = 10, --龙脉大将 FourCountryCrown = 11, --四国王冠 PetTitle = 12, --宠物专属,宠物称号 FourCountryScore = 13, --四国分数 GuildWarBomb = 14, --势力战炸弹 CurrentChannelMsg = 15, --当前频道消息 Max = 16, --最大值,新增类型时需要更新 } --几种头顶UI的模板名字 private.HeadUISourceObjName = { headImageText = "headImageText", headEffect = "headEffect", headGuild = "headGuild", headTitle = "headTitle", headTextWithImage = "headTextWithImage", headImageWithEffect = "headImageWithEffect", headCountry = "headCountry", headCDTimer = "headCDTimer", headChangAnTowerIcon_Denfender = "headChangAnTowerIcon_Denfender", headChangAnTowerIcon_Attacker = "headChangAnTowerIcon_Attacker", headChangAnCar = "headChangAnCar", headPetTitle = "headPetTitle", headChangAnTowerIcon = "headChangAnTowerIcon", headFourCountiesCount = "headFourCountiesCount", ChangAnVehicle = "headChangAnVehicle", headbomb = "headbomb", headMsg = "headMsg", } --头顶类型与头顶模板的映射 private.HeadUIType2SourceNameMapping = { [EntityHeadUIModule.HeadUIType.Guild] = private.HeadUISourceObjName.headGuild, [EntityHeadUIModule.HeadUIType.Country] = private.HeadUISourceObjName.headCountry, [EntityHeadUIModule.HeadUIType.PetTitle] = private.HeadUISourceObjName.headPetTitle, [EntityHeadUIModule.HeadUIType.Title] = private.HeadUISourceObjName.headTitle, [EntityHeadUIModule.HeadUIType.Rival] = private.HeadUISourceObjName.headEffect, [EntityHeadUIModule.HeadUIType.RivalNotChinese] = private.HeadUISourceObjName.headEffect, [EntityHeadUIModule.HeadUIType.FourCountryCrown] = private.HeadUISourceObjName.headEffect, [EntityHeadUIModule.HeadUIType.GuildWar] = private.HeadUISourceObjName.headTextWithImage, [EntityHeadUIModule.HeadUIType.FightThroneFlag] = private.HeadUISourceObjName.headImageText, [EntityHeadUIModule.HeadUIType.WorldBossHelp] = private.HeadUISourceObjName.headImageText, [EntityHeadUIModule.HeadUIType.DragonArteryTotem] = private.HeadUISourceObjName.headImageWithEffect, [EntityHeadUIModule.HeadUIType.DragonArteryGeneral] = private.HeadUISourceObjName.headImageText, [EntityHeadUIModule.HeadUIType.WorldBossNo1] = private.HeadUISourceObjName.headImageWithEffect, [EntityHeadUIModule.HeadUIType.FightThronePiece] = private.HeadUISourceObjName.headTextWithImage, [EntityHeadUIModule.HeadUIType.CDTimer] = private.HeadUISourceObjName.headCDTimer, [EntityHeadUIModule.HeadUIType.ChangAnSiegeDefendTowerState] = private.HeadUISourceObjName.headChangAnTowerIcon_Denfender, [EntityHeadUIModule.HeadUIType.ChangAnSiegeAttackTowerState] = private.HeadUISourceObjName.headChangAnTowerIcon_Attacker, [EntityHeadUIModule.HeadUIType.ChangAnCarState] = private.HeadUISourceObjName.headChangAnCar, [EntityHeadUIModule.HeadUIType.FourCountryScore] = private.HeadUISourceObjName.headFourCountiesCount, [EntityHeadUIModule.HeadUIType.ChangAnVehicle] = private.HeadUISourceObjName.ChangAnVehicle, [EntityHeadUIModule.HeadUIType.GuildWarBomb] = private.HeadUISourceObjName.headbomb, [EntityHeadUIModule.HeadUIType.CurrentChannelMsg] = private.HeadUISourceObjName.headMsg, } --头顶UI创建时,一些常驻的UI可以直接在这个时机设置 function private.OnHeadUICreate(headUIType, headUINode) if headUIType == EntityHeadUIModule.HeadUIType.WorldBossHelp then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_WORLDBOSS_HELP) headUINode.headImage:SetNativeSize() elseif headUIType == EntityHeadUIModule.HeadUIType.FightThroneFlag then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_FIGHTTHRONE_FLAG) headUINode.headImage:SetNativeSize() elseif headUIType == EntityHeadUIModule.HeadUIType.DragonArteryTotem then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_DRAGONARTERYTOTEM_FLAG) headUINode.headImage:SetNativeSize() headUINode.headImage.transform:SetLocalScale(1.2, 1.2) headUINode.headEffect:PlayUIEffect(EFFECT_DRAGONARTERY_TOTEM, 0) elseif headUIType == EntityHeadUIModule.HeadUIType.DragonArteryGeneral then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_DRAGONARTERYTOTEM_GENERAL) headUINode.headImage:SetNativeSize() elseif headUIType == EntityHeadUIModule.HeadUIType.GuildWar then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_GUILD_WAR) headUINode.headImage.transform:SetSizeDelta(70, 70) elseif headUIType == EntityHeadUIModule.HeadUIType.FightThronePiece then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_FIGHTTHRONE_PIECE) headUINode.headImage:SetNativeSize() elseif headUIType == EntityHeadUIModule.HeadUIType.Rival then headUINode.headEffect:PlayUIEffect(EFFECT_RIVAL, 0) elseif headUIType == EntityHeadUIModule.HeadUIType.RivalNotChinese then headUINode.headEffect:PlayUIEffect(EFFECT_RIVAL_NOT_CH, 0) elseif headUIType == EntityHeadUIModule.HeadUIType.FourCountryCrown then headUINode.headEffect:PlayUIEffect(EFFECT_FOUR_COUNTRY_CROWN, 0) elseif headUIType == EntityHeadUIModule.HeadUIType.WorldBossNo1 then UIUtils.SetImageByAssetBundle(headUINode.headImage, IMAGE_WORLDBOSS_NO1) headUINode.headImage.transform:SetSizeDelta(100, 100) headUINode.headEffect:PlayUIEffect(EFFECT_WORLDBOSS_NO1, 0) elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnSiegeDefendTowerState then headUINode.headChangAnTowerIcon01:PlayAnim() headUINode.headChangAnTowerIcon02:PlayAnim() elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnCarState then headUINode.headChangAnCarIcon01:PlayAnim() headUINode.headChangAnCarIcon02:PlayAnim() headUINode.headChangAnCarIcon03:PlayAnim() headUINode.headChangAnCarIcon04:PlayAnim() end end --自适应头顶UI function EntityHeadUIModule.AdjustHeadUI(headUIDic, modelNameTrans) local modelNamePosX, modelNamePosY = modelNameTrans:GetAnchoredPosition() --modelNameTrans就算内容不为空,也有概率出现modelNameWidth为0的情况,这里Rebuild一下 UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(modelNameTrans) local modelNameWidth, modelNameHeight = modelNameTrans:GetSizeDelta() local height = modelNamePosY + modelNameHeight / 2 --先处理垂直扩展的UI for i = EntityHeadUIModule.HeadUIType.Min, EntityHeadUIModule.HeadUIType.Max do local headUI = headUIDic[i] if headUI then local headUITrans = headUI.gameObject.transform local attachHeadUIType, _, nodeHeight = EntityHeadUIModule.GetAdjustParam(i) if attachHeadUIType == EntityHeadUIModule.HeadUIType.None then headUITrans:SetAnchoredPosition(0, height + nodeHeight / 2) height = height + nodeHeight end end end --再处理水平扩展的UI,其attachHeadUIType必须存在 local attachHeadUIType = EntityHeadUIModule.HeadUIType.None local attachLeftWidth = 0 local attachRightWidth = 0 for i = EntityHeadUIModule.HeadUIType.Min, EntityHeadUIModule.HeadUIType.Max do local headUI = headUIDic[i] if headUI then local headUITrans = headUI.gameObject.transform local attachType, nodeWidth, offsetHeight = EntityHeadUIModule.GetAdjustParam(i) local middleHeadUINode = headUIDic[attachType] if attachType ~= EntityHeadUIModule.HeadUIType.None and (middleHeadUINode ~= nil or attachType == EntityHeadUIModule.HeadUIType.ModelName) then local middleWidth --获取attach元素的宽度 if attachType == EntityHeadUIModule.HeadUIType.ModelName then middleWidth = modelNameWidth elseif attachType == EntityHeadUIModule.HeadUIType.Guild then UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(middleHeadUINode.lab_GuildName.transform) middleWidth = middleHeadUINode.lab_GuildName.transform:GetSizeDelta() end local attachHeight = modelNamePosY if attachType ~= EntityHeadUIModule.HeadUIType.ModelName then local _, height = middleHeadUINode.gameObject.transform:GetAnchoredPosition() attachHeight = height end if attachHeadUIType ~= attachType then attachHeadUIType = attachType attachLeftWidth = -middleWidth / 2 attachRightWidth = middleWidth / 2 end if i < attachType then headUITrans:SetAnchoredPosition(modelNamePosX - nodeWidth / 2 + attachLeftWidth, attachHeight + offsetHeight) attachLeftWidth = attachLeftWidth - nodeWidth else headUITrans:SetAnchoredPosition(modelNamePosX + nodeWidth / 2 + attachRightWidth, attachHeight + offsetHeight) attachRightWidth = attachRightWidth + nodeWidth end end end end end --attachHeadUIType 表示水平扩展的UI,需要依赖的类型;如果依赖的类型没生成,则添加不上 -- nodeWidth, nodeHeight表示节点的宽高,由于是模板克隆出来的,模板自身的宽高无法统一 function EntityHeadUIModule.GetAdjustParam(headUIType) local attachHeadUIType = EntityHeadUIModule.HeadUIType.None --只有水平扩展的UI才会有值,即依赖这个attachHeadUIType作水平拓展 local nodeHeight = 0 local nodeWidth = 0 if headUIType == EntityHeadUIModule.HeadUIType.Guild then nodeHeight = 35 elseif headUIType == EntityHeadUIModule.HeadUIType.Country then attachHeadUIType = EntityHeadUIModule.HeadUIType.ModelName if Localization.IsThailand() or Localization.IsVietnamese() then nodeWidth = 60 else nodeWidth = 20 end elseif headUIType == EntityHeadUIModule.HeadUIType.Title then nodeHeight = 80 elseif headUIType == EntityHeadUIModule.HeadUIType.PetTitle then nodeHeight = 60 elseif headUIType == EntityHeadUIModule.HeadUIType.Rival then nodeHeight = 80 elseif headUIType == EntityHeadUIModule.HeadUIType.RivalNotChinese then nodeHeight = 80 elseif headUIType == EntityHeadUIModule.HeadUIType.FourCountryCrown then nodeHeight = 120 elseif headUIType == EntityHeadUIModule.HeadUIType.GuildWar then nodeHeight = 36 elseif headUIType == EntityHeadUIModule.HeadUIType.FightThroneFlag then nodeHeight = 114 elseif headUIType == EntityHeadUIModule.HeadUIType.DragonArteryTotem then nodeHeight = 140 elseif headUIType == EntityHeadUIModule.HeadUIType.DragonArteryGeneral then nodeHeight = 140 elseif headUIType == EntityHeadUIModule.HeadUIType.WorldBossHelp then attachHeadUIType = EntityHeadUIModule.HeadUIType.ModelName nodeWidth = 64 elseif headUIType == EntityHeadUIModule.HeadUIType.WorldBossNo1 then attachHeadUIType = EntityHeadUIModule.HeadUIType.ModelName nodeWidth = 100 elseif headUIType == EntityHeadUIModule.HeadUIType.FightThronePiece then attachHeadUIType = EntityHeadUIModule.HeadUIType.ModelName if GameAppInfo.IsVietnamPackage() then nodeWidth = 155 else nodeWidth = 120 end elseif headUIType == EntityHeadUIModule.HeadUIType.CDTimer then nodeHeight = -80 elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnSiegeDefendTowerState or headUIType == EntityHeadUIModule.HeadUIType.ChangAnSiegeAttackTowerState or headUIType == EntityHeadUIModule.HeadUIType.ChangAnCarState then nodeHeight = -300 elseif headUIType == EntityHeadUIModule.HeadUIType.GuildWarBomb then nodeHeight = 145 end return attachHeadUIType, nodeWidth, nodeHeight end --设置头顶UI的动态参数 function EntityHeadUIModule.SetHeadUIParam(headUIType, headUINode, ...) if headUIType == EntityHeadUIModule.HeadUIType.Guild then local framePath, emblemContent, guildDesc = ... --framePath为空表示不显示势力徽记 if string.isNilOrEmpty(framePath) then UIUtils.SetActive(headUINode.img_GuildEmblem, false) else UIUtils.SetActive(headUINode.img_GuildEmblem, true) UIUtils.SetImageByAssetBundle(headUINode.img_GuildEmblem, framePath) end headUINode.lab_EmblemName.text = emblemContent headUINode.lab_GuildName.text = guildDesc elseif headUIType == EntityHeadUIModule.HeadUIType.Country then local countryId = ... CTL.Country.SetHeadCountryUI(headUINode.lab_Country, headUINode.img_CountryBg, countryId) elseif headUIType == EntityHeadUIModule.HeadUIType.PetTitle then headUINode.headText.text = ... elseif headUIType == EntityHeadUIModule.HeadUIType.Title then if CTL.HotFix.CheckAssetIsReady("Title") == false then UIUtils.SetActive(headUINode.img_TitleFrame, false) UIUtils.SetActive(headUINode.img_TitleIcon, false) return end if select('#', ...) > 1 then local titleName, framePath, size, lowColorNum, upColorNum = ... UIUtils.SetActive(headUINode.img_TitleIcon, false) UIUtils.SetActive(headUINode.img_TitleFrame, true) UIUtils.SetLabelText(headUINode.lab_TitleName, titleName) UIUtils.SetLocalizationImage(headUINode.img_TitleFrame, framePath) UIUtils.SetTitleText(headUINode.lab_TitleName, size, lowColorNum, upColorNum) else local titleData = ... UIUtils.SetActive(headUINode.img_TitleFrame, false) UIUtils.SetActive(headUINode.img_TitleIcon, true) UIUtils.SetLocalizationImage(headUINode.img_TitleIcon, titleData.titleIcon) headUINode.img_TitleIcon:SetNativeSize() if titleData.sceneHigh == 0 then headUINode.img_TitleIcon.transform:SetAnchoredPosition(0, -10) else headUINode.img_TitleIcon.transform:SetAnchoredPosition(0, titleData.sceneHigh) end end elseif headUIType == EntityHeadUIModule.HeadUIType.GuildWar or headUIType == EntityHeadUIModule.HeadUIType.FightThronePiece then headUINode.headText.text = ... elseif headUIType == EntityHeadUIModule.HeadUIType.CDTimer then headUINode.headCDTimer:ResetAndBeginTimer(false,...) elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnSiegeDefendTowerState then local state = ... - 1 headUINode.state:SetState(state) elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnSiegeAttackTowerState then local state, isAttack = ... if state == 3 then headUINode.state:SetState(0) if isAttack then headUINode.effect_Tower:PlayUIEffect() else headUINode.effect_Tower:StopUIEffect() end else headUINode.state:SetState(1) end elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnCarState then private.ChangAnRushCarStateChange(headUINode, ...) elseif headUIType == EntityHeadUIModule.HeadUIType.ChangAnVehicle then --进攻方驾驶中和未驾驶都显示状态图片 防守方只有敌方驾驶中才会显示图标 local state = ... and 2 or 1 if BattleDataGetter.GetMyCampID() == BattleDataGetter.GetCityWarAttackCampID() then headUINode.state:SetState(state - 1) else if state == 1 then headUINode.state:SetState(3) else headUINode.state:SetState(2) end end elseif headUIType == EntityHeadUIModule.HeadUIType.FourCountryScore then local score = ... headUINode.lab_FourCountiesCount.text = score elseif headUIType == EntityHeadUIModule.HeadUIType.GuildWarBomb then headUINode.lab_countdown:ResetAndBeginCustomTimer(false, ..., 0, UIUtils.GetLocalizedTxt(Const_IDS.IDS_GuildWar_BoomSign)) elseif headUIType == EntityHeadUIModule.HeadUIType.CurrentChannelMsg then headUINode.txt_Content.text = ... headUINode.animation:PlayAnim() end end --创建HeadUINode function EntityHeadUIModule.CreateHeadUI(headUIType, headUIGroup, view) local sourceObjName = private.HeadUIType2SourceNameMapping[headUIType] local headUINode = view:InstantiateCollection(headUIGroup, view.headUISourceObjRoot[sourceObjName].gameObject) private.OnHeadUICreate(headUIType, headUINode) return headUINode end --移除单个UI function EntityHeadUIModule.DestroyHeadUI(headUINode,headUIType, view, headUIGroup) for i, v in ipairs(headUIGroup) do if v == headUINode then if headUIType == EntityHeadUIModule.HeadUIType.CDTimer then headUINode.headCDTimer:EndTimer() end view:DestroyCollection(headUIGroup, i) break end end end --移除所有HeadUI function EntityHeadUIModule.DestroyAllHeadUI(view, headUIGroup) for i = #headUIGroup, 1, -1 do view:DestroyCollection(headUIGroup, i) end end function private.ChangAnRushCarStateChange(headUINode,state) local isAttackCamp = BattleDataGetter.GetMyCampID() == BattleDataGetter.GetCityWarAttackCampID() if state == LuaConst.ChangAnRushHUDState.Run then if not isAttackCamp then headUINode.state:SetState(2) UIUtils.SetLabelText(headUINode.lab3, Const_IDS.IDS_SiegeCity_Go) headUINode.effect_Car2:PlayUIEffect() else headUINode.state:SetState(1) UIUtils.SetLabelText(headUINode.lab2, Const_IDS.IDS_SiegeCity_Go) headUINode.effect_Car3:PlayUIEffect() end elseif state == LuaConst.ChangAnRushHUDState.AttackGate then if not isAttackCamp then headUINode.state:SetState(2) UIUtils.SetLabelText(headUINode.lab3, Const_IDS.IDS_SiegeCity_Attacking) headUINode.effect_Car3:PlayUIEffect() else headUINode.state:SetState(1) UIUtils.SetLabelText(headUINode.lab2, Const_IDS.IDS_SiegeCity_Attacking) headUINode.effect_Car2:PlayUIEffect() end else if isAttackCamp then headUINode.state:SetState(3) else headUINode.state:SetState(state - 1) end end end return EntityHeadUIModule