local CsXTextManager = CS.XTextManager local XUiBattleRoleRoomDefaultProxy = require("XUi/XUiNewRoomSingle/XUiBattleRoleRoomDefaultProxy") local XUiPanelRoleModel = require("XUi/XUiCharacter/XUiPanelRoleModel") local XUiBattleRoleRoom = XLuaUiManager.Register(XLuaUi, "UiBattleRoleRoom") local XSpecialTrainActionRandom = require("XUi/XUiSpecialTrainBreakthrough/XSpecialTrainActionRandom") local MAX_ROLE_COUNT = 3 local LONG_TIMER = 1 --[[ 基本描述:通用编队界面,支持所有类型角色编队(XCharacter, XRobot, 其他自定义实体) 参数说明:stageId : Stage表的Id team : XTeam 队伍数据,可通过XTeamManager相关接口获取对应的队伍或自己系统创建的队伍 proxy : 代理定义,必须传入继承自XUiBattleRoleRoomDefaultProxy的类定义或传入匿名类(如下) -- 偷懒的一种写法,来源于1.只想实现一个接口而不想创建整个文件 2.修正旧编队界面带来的耦合逻辑写法 匿名类:{ -- proxy : 等同于self, 属于代理实例, 是匿名类重写的接口的第一个参数 GetRoleAbility = function(proxy, entityId) -- eg : 根据id处理自己的角色战力 end } challengeCount : 挑战次数 使用规则:1.可参考XUiBattleRoleRoomDefaultProxy文件去重写自己玩法需要的接口,接口已基本写明注释,或查询该文件看相关实现 2.当前页面增加功能时,如果不是通用编队的功能或不是所有玩法大概率能够使用的功能尽量不要直接加,可通过AOP接口切上下去加自己的功能 3.可任意追加AOP接口,比如AOPOnStartBefore,AOPOnStartAfter,只切上下面去处理自己的逻辑 ]] function XUiBattleRoleRoom:OnAwake() -- 重定义 begin self.FirstEnterBtnGroup = self.PanelTabCaptain self.PanelFirstEnterTag1 = self.PanelFirstRole1 self.PanelFirstEnterTag2 = self.PanelFirstRole2 self.PanelFirstEnterTag3 = self.PanelFirstRole3 self.UiObjPartner1 = self.CharacterPets1 self.UiObjPartner2 = self.CharacterPets2 self.UiObjPartner3 = self.CharacterPets3 self.UiPointerCharacter1 = self.BtnChar1:GetComponent("XUiPointer") self.UiPointerCharacter2 = self.BtnChar2:GetComponent("XUiPointer") self.UiPointerCharacter3 = self.BtnChar3:GetComponent("XUiPointer") self.PanelRightTopTip = self.PanelTip self.TxtRightTopTip = self.TxtTips1 self.FightControlGo = self.PanelNewRoomFightControl -- 重定义 end self.FubenManager = XDataCenter.FubenManager self.TeamManager = XDataCenter.TeamManager self.FavorabilityManager = XDataCenter.FavorabilityManager -- XTeam self.Team = nil self.StageId = nil self.Proxy = nil self.ChallengeCount = nil self.UiPanelRoleModels = nil self.LongClickTime = 0 self.Camera = nil self.ChildPanelData = nil -- XUiNewRoomFightControl self.FightControl = nil self:InitUiPanelRoleModels() self:RegisterUiEvents() self:RegisterListeners() end -- team : XTeam, 不传的话默认使用主线队伍, 如果是旧系统改过来,可以参考下XTeamManager后面新加的接口去处理旧队伍数据 -- challengeCount : number, 挑战次数 function XUiBattleRoleRoom:OnStart(stageId, team, proxy, challengeCount, isReadArgsByCacheWithAgain) if isReadArgsByCacheWithAgain == nil then isReadArgsByCacheWithAgain = false end self.Camera = self.Transform:GetComponent("Canvas").worldCamera local stageConfig = self.FubenManager.GetStageCfg(stageId) -- 判断是否有重复挑战 if XRoomSingleManager.AgainBtnType[stageConfig.FunctionLeftBtn] or XRoomSingleManager.AgainBtnType[stageConfig.FunctionRightBtn] then XUiBattleRoleRoom.__StageId2ArgData = XUiBattleRoleRoom.__StageId2ArgData or {} local argData = XUiBattleRoleRoom.__StageId2ArgData[stageId] if isReadArgsByCacheWithAgain and argData then team = argData.team proxy = argData.proxy challengeCount = argData.challengeCount end XUiBattleRoleRoom.__StageId2ArgData[stageId] = { stageId = stageId, team = team, proxy = proxy, challengeCount = challengeCount } end local robotIds = stageConfig.RobotId if #robotIds > 0 and stageConfig.HideAction ~= 1 then -- 说明要使用机器人,默认抛弃传入的队伍和代理 -- 去掉队伍是因为已经用不到原队伍,强制使用配置的机器人 team = nil end -- 若队伍为空,优先根据关卡固定机器人,其次读取默认主线队伍 if team == nil then if #robotIds > 0 then team = self.TeamManager.CreateTempTeam(XTool.Clone(robotIds)) else team = self.TeamManager.GetMainLineTeam() end end if challengeCount == nil then challengeCount = 1 end self.Team = team self.StageId = stageId local proxyInstance = nil -- 代理实例 if proxy == nil then -- 使用默认的 proxyInstance = XUiBattleRoleRoomDefaultProxy.New(team, stageId) elseif not CheckIsClass(proxy) then -- 使用匿名类 proxyInstance = CreateAnonClassInstance(proxy, XUiBattleRoleRoomDefaultProxy, team, stageId) else -- 使用自定义类 proxyInstance = proxy.New(team, stageId) end self.Proxy = proxyInstance self.ChallengeCount = challengeCount -- 避免其他系统队伍数据错乱,预先清除 self.Proxy:ClearErrorTeamEntityId(team, function(entityId) return self.Proxy:GetCharacterViewModelByEntityId(entityId) ~= nil end) local isStop = self.Proxy:AOPOnStartBefore(self) if isStop then return end if not self.Proxy:CheckStageRobotIsUseCustomProxy(robotIds) then if proxy ~= nil then self.Proxy = XUiBattleRoleRoomDefaultProxy.New(team, stageId) -- 写回默认的代理 end end -- 关卡名字刷新 self:RefreshStageName() self.BtnShowInfoToggle:SetButtonState(self.Team:GetIsShowRoleDetailInfo() and XUiButtonState.Select or XUiButtonState.Normal) -- 注册自动关闭 local openAutoClose, autoCloseEndTime, callback = self.Proxy:GetAutoCloseInfo() if openAutoClose then self:SetAutoCloseInfo(autoCloseEndTime, callback) end -- 设置不可编辑时按钮状态 local canEditor = self.Proxy:CheckIsCanEditorTeam(self.StageId, false) self.BtnTeamPrefab.gameObject:SetActiveEx(canEditor and not XUiManager.IsHideFunc) self.PanelFirstInfo.gameObject:SetActiveEx(canEditor) self.BtnShowInfoToggle.gameObject:SetActiveEx(canEditor) self.Proxy:AOPOnStartAfter(self) end function XUiBattleRoleRoom:OnEnable() XUiBattleRoleRoom.Super.OnEnable(self) self:RefreshRoleInfos() -- 设置首出信息 self.FirstEnterBtnGroup:SelectIndex(self.Team:GetFirstFightPos()) -- 刷新提示 self:RefreshTipGrids() -- 刷新支援状态 self:RefreshSupportToggle() -- 刷新战力控制状态 self:RefreshFightControlState() -- 刷新角色详细信息 local canEditor = self.Proxy:CheckIsCanEditorTeam(self.StageId, false) local showRoleDetail = nil if not canEditor then showRoleDetail = false end self:RefreshRoleDetalInfo(showRoleDetail) -- 设置子面板配置 self.ChildPanelData = self.Proxy:GetChildPanelData() self:LoadChildPanelInfo() -- 设置进入战斗按钮状态 local isEmpty = self.Team:GetIsEmpty() self.BtnEnterFight:SetDisable(isEmpty, not isEmpty) self.Proxy:AOPOnEnableAfter(self) end -- 此方法调用优先级高于所有方法,此时self.Proxy是空的 -- 因此这里只能硬编码 function XUiBattleRoleRoom:OnGetEvents() return { XEventId.EVENT_ACTIVITY_ON_RESET } end function XUiBattleRoleRoom:OnNotify(evt, ...) self.Proxy:OnNotify(evt, ...) end function XUiBattleRoleRoom:OnDisable() XUiBattleRoleRoom.Super.OnDisable(self) self.FavorabilityManager.StopCv() end function XUiBattleRoleRoom:OnDestroy() XUiBattleRoleRoom.Super.OnDestroy(self) self:UnRegisterListeners() if self.ChildPanelData and self.ChildPanelData.instanceProxy and self.ChildPanelData.instanceProxy.OnDestroy then self.ChildPanelData.instanceProxy:OnDestroy() end self.FavorabilityManager.StopCv() for k, cuteRandomControllers in pairs(self.CuteRandomControllers) do if cuteRandomControllers then cuteRandomControllers:Stop() end end end --######################## 私有方法 ######################## function XUiBattleRoleRoom:RegisterUiEvents() self.BtnBack.CallBack = function() self:Close() end self.BtnMainUi.CallBack = function() XLuaUiManager.RunMain() end self.BtnEnterFight.CallBack = function() self:OnBtnEnterFightClicked() end self.BtnShowInfoToggle.CallBack = function(val) self:OnBtnShowInfoToggleClicked(val) end self.BtnLeader.CallBack = function() self:OnBtnLeaderClicked() end -- 首出按钮组 local firstTabGroup = { self.BtnRed, self.BtnBlue, self.BtnYellow } self.FirstEnterBtnGroup:Init(firstTabGroup, function(tabIndex) self:OnEnterSortBtnGroupClicked(tabIndex) end) -- 角色拖动相关 XUiButtonLongClick.New(self.UiPointerCharacter1, 10, self, nil, self.OnBtnCharacter1LongClicked, self.OnBtnCharacter1LongClickUp, false) XUiButtonLongClick.New(self.UiPointerCharacter2, 10, self, nil, self.OnBtnCharacter2LongClicked, self.OnBtnCharacter2LongClickUp, false) XUiButtonLongClick.New(self.UiPointerCharacter3, 10, self, nil, self.OnBtnCharacter3LongClicked, self.OnBtnCharacter3LongClickUp, false) -- 角色点击 self:RegisterClickEvent(self.BtnChar1, self.OnBtnChar1Clicked) self:RegisterClickEvent(self.BtnChar2, self.OnBtnChar2Clicked) self:RegisterClickEvent(self.BtnChar3, self.OnBtnChar3Clicked) self.BtnTeamPrefab.CallBack = function() self:OnBtnTeamPrefabClicked() end -- 宠物加号点击 local uiObjPartner for pos = 1, MAX_ROLE_COUNT do uiObjPartner = self["UiObjPartner" .. pos] uiObjPartner:GetObject("BtnClick").CallBack = function() if not self.Proxy:CheckIsCanEditorTeam(self.StageId) then return end if self.Proxy:AOPGoPartnerCarry(self.Team, pos) then return end local entityId = self.Team:GetEntityIdByTeamPos(pos) if XEntityHelper.GetIsRobot(entityId) then XUiManager.TipErrorWithKey("RobotParnerTips") return end XDataCenter.PartnerManager.GoPartnerCarry(self.Team:GetEntityIdByTeamPos(pos), false) end end -- 支援 self.BtnSupportToggle.CallBack = function(state) self:OnBtnSupportToggleClicked(state) end end function XUiBattleRoleRoom:RegisterListeners() XEventManager.AddEventListener(XEventId.EVENT_FIGHT_BEGIN_PLAYMOVIE, self.OnBeginBattleAutoRemove, self) XEventManager.AddEventListener(XEventId.EVENT_FIGHT_LOADINGFINISHED, self.OnBeginBattleAutoRemove, self) end function XUiBattleRoleRoom:UnRegisterListeners() XEventManager.RemoveEventListener(XEventId.EVENT_FIGHT_BEGIN_PLAYMOVIE, self.OnBeginBattleAutoRemove, self) XEventManager.RemoveEventListener(XEventId.EVENT_FIGHT_LOADINGFINISHED, self.OnBeginBattleAutoRemove, self) end function XUiBattleRoleRoom:OnBtnSupportToggleClicked(state) if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.OtherHelp) then return end CS.UnityEngine.PlayerPrefs.SetInt(XPrefs.AssistSwitch .. XPlayer.Id, state) if state == 1 then self:PlayRightTopTips(XUiHelper.GetText("FightAssistOpen")) else self:PlayRightTopTips(XUiHelper.GetText("FightAssistClose")) end end function XUiBattleRoleRoom:OnBtnTeamPrefabClicked() RunAsyn(function() local stageInfo = XDataCenter.FubenManager.GetStageInfo(self.StageId) XLuaUiManager.Open("UiRoomTeamPrefab", self.Team:GetCaptainPos() , self.Team:GetFirstFightPos() , self:GetCharacterLimitType() , nil, stageInfo.Type, nil, nil , self.StageId , self.Team) local signalCode, teamData = XLuaUiManager.AwaitSignal("UiRoomTeamPrefab", "RefreshTeamData", self) if signalCode ~= XSignalCode.SUCCESS then return end teamData = self.Proxy:FilterPresetTeamEntitiyIds(teamData) local playEntityId = 0 local soundType = XFavorabilityConfigs.SoundEventType.MemberJoinTeam -- 优先队长音效 local captainEntityId = teamData.TeamData[teamData.CaptainPos] -- PS:这里GetCaptainPos初版应该写错了,刚好造成设置队伍预设时导致永远播放预设中的队长进场音效 -- 如果改回GetCaptainPosEntityId应该是符合初版的逻辑:队长音效优先,按顺序队员。后面如果有相关反馈,可以和策划对下用哪个逻辑即可。 if captainEntityId ~= self.Team:GetCaptainPos() then playEntityId = captainEntityId soundType = XFavorabilityConfigs.SoundEventType.CaptainJoinTeam else -- 其次队员音效 for pos, newEntityId in ipairs(teamData.TeamData) do if self.Team:GetEntityIdByTeamPos(pos) ~= newEntityId then playEntityId = newEntityId soundType = XFavorabilityConfigs.SoundEventType.MemberJoinTeam break end end end self.Team:UpdateFromTeamData(teamData) if playEntityId <= 0 then return end self.FavorabilityManager.PlayCvByType(self.Proxy:GetCharacterIdByEntityId(playEntityId) , soundType) end) end function XUiBattleRoleRoom:OnBeginBattleAutoRemove() self:Remove() end function XUiBattleRoleRoom:OnBtnLeaderClicked() local characterViewModelDic = {} local viewModel = nil for pos, entityId in pairs(self.Team:GetEntityIds()) do characterViewModelDic[pos] = self.Proxy:GetCharacterViewModelByEntityId(entityId) end XLuaUiManager.Open("UiBattleRoleRoomCaptain", characterViewModelDic, self.Team:GetCaptainPos(), function(newCaptainPos) self.Team:UpdateCaptainPos(newCaptainPos) self:RefreshCaptainPosInfo() end) end -- val : 1 or 0 , 1是开启,0是关闭 function XUiBattleRoleRoom:OnBtnShowInfoToggleClicked(val) self.Team:SaveIsShowRoleDetailInfo(val) self:RefreshRoleDetalInfo(val == 1) end function XUiBattleRoleRoom:OnBtnChar1Clicked() self:OnBtnCharacterClicked(1) end function XUiBattleRoleRoom:OnBtnChar2Clicked() self:OnBtnCharacterClicked(2) end function XUiBattleRoleRoom:OnBtnChar3Clicked() self:OnBtnCharacterClicked(3) end function XUiBattleRoleRoom:OnBtnCharacter1LongClicked(time) self:OnBtnCharacterLongClick(1, time) end function XUiBattleRoleRoom:OnBtnCharacter2LongClicked(time) self:OnBtnCharacterLongClick(2, time) end function XUiBattleRoleRoom:OnBtnCharacter3LongClicked(time) self:OnBtnCharacterLongClick(3, time) end function XUiBattleRoleRoom:OnBtnCharacter1LongClickUp() self:OnBtnCharacterLongClickUp(1) end function XUiBattleRoleRoom:OnBtnCharacter2LongClickUp() self:OnBtnCharacterLongClickUp(2) end function XUiBattleRoleRoom:OnBtnCharacter3LongClickUp() self:OnBtnCharacterLongClickUp(3) end function XUiBattleRoleRoom:OnBtnCharacterLongClick(index, time) if not self.Proxy:CheckIsCanEditorTeam(self.StageId) then return end if not self.Proxy:CheckIsCanDrag(self.StageId) then return end -- 无实体直接不处理 if self.Team:GetEntityIdByTeamPos(index) == 0 then return end self.LongClickTime = self.LongClickTime + time / 1000 if self.LongClickTime > LONG_TIMER then self.ImgRoleRepace.gameObject:SetActiveEx(true) self.ImgRoleRepace.transform.localPosition = self:GetClickPosition() end end function XUiBattleRoleRoom:OnBtnCharacterLongClickUp(index) -- 未激活不处理 if not self.ImgRoleRepace.gameObject.activeSelf then return end self.LongClickTime = 0 self.ImgRoleRepace.gameObject:SetActiveEx(false) local transformWidth = self.Transform.rect.width local targetX = math.floor(self:GetClickPosition().x + transformWidth / 2) local targetIndex if targetX <= transformWidth / 3 then targetIndex = 2 elseif targetX > transformWidth / 3 and targetX <= transformWidth / 3 * 2 then targetIndex = 1 else targetIndex = 3 end -- 相同直接不处理 if index == targetIndex then return end self.Team:SwitchEntityPos(index, targetIndex) -- 刷新角色信息 self:ActiveSelectColorEffect(targetIndex) self:RefreshRoleInfos() self:LoadChildPanelInfo() self:RefreshPartners() self:RefreshRoleDetalInfo() end function XUiBattleRoleRoom:OnBtnCharacterClicked(index) local isStop = self.Proxy:AOPOnCharacterClickBefore(self, index) if isStop then return end if not self.Proxy:CheckIsCanEditorTeam(self.StageId) then return end RunAsyn(function() local oldEntityId = self.Team:GetEntityIdByTeamPos(index) XLuaUiManager.Open("UiBattleRoomRoleDetail" , self.StageId , self.Team , index , self.Proxy:GetRoleDetailProxy()) local signalCode, newEntityId = XLuaUiManager.AwaitSignal("UiBattleRoomRoleDetail", "UpdateEntityId", self) if signalCode ~= XSignalCode.SUCCESS then return end if oldEntityId == newEntityId then return end if self.Team:GetEntityIdByTeamPos(index) <= 0 then return end -- 播放音效 local soundType = XFavorabilityConfigs.SoundEventType.MemberJoinTeam if self.Team:GetCaptainPos() == index then soundType = XFavorabilityConfigs.SoundEventType.CaptainJoinTeam end self.FavorabilityManager.PlayCvByType(self.Proxy:GetCharacterIdByEntityId(newEntityId) , soundType) -- 播放脚底选中特效 self:ActiveSelectColorEffect(index) end) end function XUiBattleRoleRoom:OnBtnEnterFightClicked() if self.Proxy:AOPOnClickFight(self) then return end local canEnterFight, errorTip = self.Proxy:GetIsCanEnterFight(self.Team, self.StageId) if not canEnterFight then if errorTip then XUiManager.TipError(errorTip) end return end RunAsyn(function() -- 战力警告 if self.FightControl then local fightControlResult, tipContent = self.FightControl:GetResult() if fightControlResult == XUiFightControlState.Ex then XUiManager.DialogTip(XUiHelper.GetText("AbilityInsufficient"), tipContent, XUiManager.DialogType.Normal) local signalCode, isOK = XLuaUiManager.AwaitSignal("UiDialog", "Close", self) if signalCode ~= XSignalCode.SUCCESS then return end if not isOK then return end end end local isAssist = CS.UnityEngine.PlayerPrefs.GetInt(XPrefs.AssistSwitch .. XPlayer.Id) == 1 self.Proxy:EnterFight(self.Team, self.StageId, self.ChallengeCount, isAssist) end) end function XUiBattleRoleRoom:OnEnterSortBtnGroupClicked(index) self.Team:UpdateFirstFightPos(index) self:RefreshFirstFightInfo() end function XUiBattleRoleRoom:InitUiPanelRoleModels() local uiModelRoot = self.UiModelGo.transform self.UiPanelRoleModels = {} self.CuteRandomControllers = {} for i = 1, MAX_ROLE_COUNT do self.UiPanelRoleModels[i] = XUiPanelRoleModel.New(uiModelRoot:FindTransform("PanelRoleModel" .. i) , self.Name, nil, true, nil, true, true) self.CuteRandomControllers[i] = XSpecialTrainActionRandom.New() end end function XUiBattleRoleRoom:RefreshRoleModels() local characterViewModel local entityId local sourceEntityId local uiPanelRoleModel local cuteRandomController -- local finishedCallback = function() -- end for pos = 1, MAX_ROLE_COUNT do cuteRandomController = self.CuteRandomControllers[pos] uiPanelRoleModel = self.UiPanelRoleModels[pos] entityId = self.Team:GetEntityIdByTeamPos(pos) characterViewModel = self.Proxy:GetCharacterViewModelByEntityId(entityId) self["ImgAdd" .. pos].gameObject:SetActiveEx(characterViewModel == nil) if characterViewModel then --先展示模型根节点,避免隐藏后,重新显示时,动画无法播放 uiPanelRoleModel:ShowRoleModel() sourceEntityId = characterViewModel:GetSourceEntityId() if XRobotManager.CheckIsRobotId(sourceEntityId) then local robot2CharEntityId = XRobotManager.GetCharacterId(sourceEntityId) -- charId local isOwn = XDataCenter.CharacterManager.IsOwnCharacter(robot2CharEntityId) -- 检测启用q版 if self.Proxy:CheckUseCuteModel() and XCharacterCuteConfig.CheckHasCuteModel(robot2CharEntityId) then if isOwn then uiPanelRoleModel:UpdateCuteModel(nil, robot2CharEntityId, nil, nil, nil, nil, true) else local robotConfig = XRobotManager.GetRobotTemplate(sourceEntityId) uiPanelRoleModel:UpdateCuteModel(nil, robotConfig.CharacterId, nil, nil, nil, nil, true) end else if XRobotManager.CheckUseFashion(sourceEntityId) and isOwn then local character2 = XDataCenter.CharacterManager.GetCharacter(robot2CharEntityId) local robot2CharViewModel = character2:GetCharacterViewModel() uiPanelRoleModel:UpdateCharacterModel(robot2CharEntityId, nil, nil, nil, nil, robot2CharViewModel:GetFashionId()) else local robotConfig = XRobotManager.GetRobotTemplate(sourceEntityId) uiPanelRoleModel:UpdateRobotModel(sourceEntityId, robotConfig.CharacterId , nil, robotConfig.FashionId, robotConfig.WeaponId, nil, nil, nil, "UiBattleRoleRoom") end end else if self.Proxy:CheckUseCuteModel() and XCharacterCuteConfig.CheckHasCuteModel(sourceEntityId) then uiPanelRoleModel:UpdateCuteModel(nil, sourceEntityId, nil, nil, nil, nil, true) else uiPanelRoleModel:UpdateCharacterModel(sourceEntityId, nil, self.Name, nil, nil, characterViewModel:GetFashionId()) end end else uiPanelRoleModel:HideRoleModel() end end -- 最后再刷新q版状态机 if self.Proxy:CheckUseCuteModel() then for pos = 1, MAX_ROLE_COUNT do cuteRandomController = self.CuteRandomControllers[pos] uiPanelRoleModel = self.UiPanelRoleModels[pos] cuteRandomController:Stop() -- 如果有人物再刷新 if uiPanelRoleModel:GetAnimator() then cuteRandomController:SetAnimator(uiPanelRoleModel:GetAnimator(), {}, uiPanelRoleModel) cuteRandomController:Play() end end end end function XUiBattleRoleRoom:RefreshPartners() local isStop = self.Proxy:AOPOnRefreshPartnersBefore(self) if isStop then return end local entityId = 0 local partner = nil local characterViewModel = nil local uiObjPartner local rImgParnetIcon = nil local rImgPlus = nil for pos = 1, MAX_ROLE_COUNT do entityId = self.Team:GetEntityIdByTeamPos(pos) partner = self.Proxy:GetPartnerByEntityId(entityId) characterViewModel = self.Proxy:GetCharacterViewModelByEntityId(entityId) uiObjPartner = self["UiObjPartner" .. pos] uiObjPartner.gameObject:SetActiveEx(characterViewModel ~= nil and not XUiManager.IsHideFunc) rImgParnetIcon = uiObjPartner:GetObject("RImgType") rImgParnetIcon.gameObject:SetActiveEx(partner ~= nil) rImgPlus = uiObjPartner:GetObject("Img+") rImgPlus.gameObject:SetActiveEx(not partner) if partner then rImgParnetIcon:SetRawImage(partner:GetIcon()) end end end function XUiBattleRoleRoom:RefreshRoleEffects() -- local uiModelRoot = self.UiModelGo.transform -- local panelRoleBGEffectGo -- local teamConfig -- local isLoadRoleBGEffect = self.Proxy:GetIsShowRoleBGEffect() -- 暂时不需要加载特效了 -- for i = 1, MAX_ROLE_COUNT do -- -- 加载背景特效 -- if isLoadRoleBGEffect then -- teamConfig = XTeamConfig.GetTeamCfgById(i) -- panelRoleBGEffectGo = uiModelRoot:FindTransform("PanelRoleEffect" .. i).gameObject -- panelRoleBGEffectGo:LoadPrefab(teamConfig.EffectPath, false) -- end -- end -- end -- 激活脚底选人特效 function XUiBattleRoleRoom:ActiveSelectColorEffect(index) local uiModelRoot = self.UiModelGo.transform local panelRoleBGEffect = uiModelRoot:FindTransform("PanelRoleEffect" .. index) local activeAnim = panelRoleBGEffect:FindTransform("DimianStart") activeAnim:GetComponent(typeof(CS.UnityEngine.ParticleSystem)):Play() end function XUiBattleRoleRoom:RefreshFirstFightInfo() for i = 1, MAX_ROLE_COUNT do self["PanelFirstEnterTag" .. i].gameObject:SetActiveEx(self.Team:GetFirstFightPos() == i) end end function XUiBattleRoleRoom:RefreshCaptainPosInfo() local captainPos = self.Team:GetCaptainPos() local entityId = self.Team:GetEntityIdByTeamPos(captainPos) local characterViewModel = self.Proxy:GetCharacterViewModelByEntityId(entityId) self.RImgCapIcon.gameObject:SetActiveEx(characterViewModel ~= nil) self.TxtSkillDesc.gameObject:SetActiveEx(characterViewModel ~= nil) if characterViewModel then local captainSkillInfo = characterViewModel:GetCaptainSkillInfo() self.RImgCapIcon:SetRawImage(characterViewModel:GetSmallHeadIcon()) self.TxtSkillName.text = captainSkillInfo.Name self.TxtSkillDesc.text = captainSkillInfo.Level > 0 and captainSkillInfo.Intro or CsXTextManager.GetText("CaptainSkillLock") else self.TxtSkillName.text = CsXTextManager.GetText("TeamDoNotChooseCaptain") end end function XUiBattleRoleRoom:RefreshRoleInfos() -- 刷新角色模型 self:RefreshRoleModels() -- 刷新角色特效 self:RefreshRoleEffects() -- 刷新伙伴 self:RefreshPartners() -- 刷新队长信息 self:RefreshCaptainPosInfo() self.Proxy:AOPRefreshRoleInfosAfter(self) end function XUiBattleRoleRoom:LoadChildPanelInfo() if not self.ChildPanelData then return end local childPanelData = self.ChildPanelData -- 加载panel asset local instanceGo = childPanelData.instanceGo if XTool.UObjIsNil(instanceGo) then instanceGo = self.PanelExtraUiInfo:LoadPrefab(childPanelData.assetPath) childPanelData.instanceGo = instanceGo -- 加载panel proxy childPanelData.instanceProxy = childPanelData.proxy.New(instanceGo) end -- 加载proxy参数 local proxyArgs = {} if childPanelData.proxyArgs then for _, argName in ipairs(childPanelData.proxyArgs) do if type(argName) == "string" then proxyArgs[#proxyArgs + 1] = self[argName] else proxyArgs[#proxyArgs + 1] = argName end end end childPanelData.instanceProxy:SetData(table.unpack(proxyArgs)) end function XUiBattleRoleRoom:RefreshStageName() local chapterName, stageName = self.FubenManager.GetFubenNames(self.StageId) self.TxtChapterName.text = chapterName self.TxtStageName.text = stageName end function XUiBattleRoleRoom:RefreshRoleDetalInfo(isShow) if isShow == nil then isShow = self.Team:GetIsShowRoleDetailInfo() end local entityId local characterViewModel for pos = 1, 3 do self["CharacterInfo" .. pos].gameObject:SetActiveEx(isShow) if isShow then entityId = self.Team:GetEntityIdByTeamPos(pos) characterViewModel = self.Proxy:GetCharacterViewModelByEntityId(entityId) if characterViewModel then self["TxtFight" .. pos].text = self.Proxy:GetRoleAbility(entityId) self["RImgType" .. pos]:SetRawImage(characterViewModel:GetProfessionIcon()) else self["CharacterInfo" .. pos].gameObject:SetActiveEx(false) end end end end -- 刷新提示 function XUiBattleRoleRoom:RefreshTipGrids() -- 创建玩法自定义提示 self.Proxy:CreateCustomTipGo(self.PanelTipGoContainer) -- 自身提示 local descs = {} -- 关卡条件描述 local suggestedConditionIds, forceConditionIds = XDataCenter.FubenManager.GetConditonByMapId(self.StageId) local conditions = {} appendArray(conditions, suggestedConditionIds) appendArray(conditions, forceConditionIds) for _, id in ipairs(conditions) do local _, desc = XConditionManager.CheckCondition(id, self.Team:GetEntityIds()) table.insert(descs, desc) end -- 关卡事件配置描述 local eventDesc = XRoomSingleManager.GetEventDescByMapId(self.StageId) if eventDesc then table.insert(descs, eventDesc) end -- 追加代理提示 descs = appendArray(descs, self.Proxy:GetTipDescs()) -- 创建提示 XUiHelper.RefreshCustomizedList(self.PanelTipContainer, self.GridTips, #descs, function(i, grid) grid:GetComponent("UiObject"):GetObject("TxtDesc").text = descs[i] end) self.PanelTipContainer.gameObject:SetActiveEx(#descs > 0) -- 将所有的限制,职业,试用提示隐藏 self.PanelCharacterLimit.gameObject:SetActiveEx(false) self.PanelCharacterCareer.gameObject:SetActiveEx(false) if self.Proxy:AOPHideCharacterLimits() then return end local viewModels = {} local teamEntityIds = {} for _, entityId in ipairs(self.Team:GetEntityIds()) do if entityId > 0 then table.insert(viewModels, self.Proxy:GetCharacterViewModelByEntityId(entityId)) table.insert(teamEntityIds, entityId) end end -- 检查是否满足角色限制条件 if XEntityHelper.CheckIsNeedRoleLimit(self.StageId, viewModels) then self:RefreshRoleLimitTip() return end -- 检查职业推荐 local needCareerTip, types, indexDic = XEntityHelper.CheckIsNeedCareerLimit(self.StageId, viewModels) if needCareerTip then self.PanelCharacterCareer.gameObject:SetActiveEx(true) XUiHelper.RefreshCustomizedList(self.PanelCareerList, self.GridCareer, #types, function(index, grid) local uiObject = grid.transform:GetComponent("UiObject") local isActive = indexDic[index] or false local professionIcon = XCharacterConfigs.GetNpcTypeIcon(types[index]) uiObject:GetObject("Normal").gameObject:SetActiveEx(isActive) uiObject:GetObject("Disable").gameObject:SetActiveEx(not isActive) uiObject:GetObject("RImgNormalIcon"):SetRawImage(professionIcon) uiObject:GetObject("RImgDisableIcon"):SetRawImage(professionIcon) end) return end -- 检查试用角色 if XFubenConfigs.GetStageAISuggestType(self.StageId) ~= XFubenConfigs.AISuggestType.Robot then return end local compareAbility = false -- 拿到试玩角色的战力字典 local characterId2AbilityDicWithRobot = {} local viewModel local entities = self.Proxy:GetEntities() if #entities <= 0 then XLog.Error(string.format("关卡Id%s字段AISuggestType配置为AISuggestType.Robot,但GetEntities获取数据为空,请实现GetEntities接口,可支持机器人战力提示" , self.StageId)) end for _, entity in ipairs(entities) do viewModel = self.Proxy:GetCharacterViewModelByEntityId(entity:GetId()) if XEntityHelper.GetIsRobot(viewModel:GetSourceEntityId()) then characterId2AbilityDicWithRobot[viewModel:GetId()] = self.Proxy:GetRoleAbility(entity:GetId()) end end -- 与队伍比较 for index, value in ipairs(viewModels) do if self.Proxy:GetRoleAbility(teamEntityIds[index]) < (characterId2AbilityDicWithRobot[value:GetId()] or 0) then compareAbility = true break end end if compareAbility then self.PanelCharacterLimit.gameObject:SetActiveEx(true) self.ImgCharacterLimit.gameObject:SetActiveEx(false) self.TxtCharacterLimit.text = XUiHelper.GetText("TeamRobotTips") end end function XUiBattleRoleRoom:RefreshRoleLimitTip() -- XFubenConfigs.CharacterLimitType local limitType = self:GetCharacterLimitType() local isShow = XFubenConfigs.IsStageCharacterLimitConfigExist(limitType) self.PanelCharacterLimit.gameObject:SetActiveEx(isShow or false) if not isShow then return end -- 图标 self.ImgCharacterLimit:SetSprite(XFubenConfigs.GetStageCharacterLimitImageTeamEdit(limitType)) -- 文案 if limitType == XFubenConfigs.CharacterLimitType.IsomerDebuff or limitType == XFubenConfigs.CharacterLimitType.NormalDebuff then self.TxtCharacterLimit.text = XFubenConfigs.GetStageMixCharacterLimitTips(limitType , self:GetTeamCharacterTypes()) return end local limitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(self.StageId) self.TxtCharacterLimit.text = XFubenConfigs.GetStageCharacterLimitTextTeamEdit(limitType , self.Team:GetCharacterType(), limitBuffId) end function XUiBattleRoleRoom:GetTeamCharacterTypes() local result = {} for _, entityId in ipairs(self.Team:GetEntityIds()) do if entityId > 0 then table.insert(result, self.Proxy:GetCharacterViewModelByEntityId(entityId):GetCharacterType()) end end return result end function XUiBattleRoleRoom:RefreshSupportToggle() local stageInfo = self.FubenManager.GetStageInfo(self.StageId) -- 关卡不需要支援直接隐藏返回 if stageInfo and stageInfo.HaveAssist ~= 1 then self.BtnSupportToggle.gameObject:SetActiveEx(false) return end -- 主线,或者HaveAssist为1显示支援 self.BtnSupportToggle.gameObject:SetActiveEx(true) -- 设置是否开启支援功能 local canOpen = XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.OtherHelp) self.BtnSupportToggle:SetButtonState(canOpen and XUiButtonState.Normal or XUiButtonState.Disable) if not canOpen then return end -- 设置上一次支援状态 local assistSwitch = CS.UnityEngine.PlayerPrefs.GetInt(XPrefs.AssistSwitch .. XPlayer.Id) self.BtnSupportToggle:SetButtonState(assistSwitch == 1 and XUiButtonState.Select or XUiButtonState.Normal) end function XUiBattleRoleRoom:PlayRightTopTips(message) self.PanelRightTopTip.gameObject:SetActiveEx(true) self.TxtRightTopTip.text = message self:PlayAnimation("PanelTipEnable") end -- 刷新战力控制状态 function XUiBattleRoleRoom:RefreshFightControlState() local isStop = self.Proxy:AOPRefreshFightControlStateBefore(self) if isStop then return end local stageConfig = self.FubenManager.GetStageCfg(self.StageId) local teamAbilities = {} local viewModel = nil for pos, entityId in ipairs(self.Team:GetEntityIds()) do viewModel = self.Proxy:GetCharacterViewModelByEntityId(entityId) if viewModel == nil then table.insert(teamAbilities, 0) else table.insert(teamAbilities, self.Proxy:GetRoleAbility(entityId)) end end if self.FightControl == nil then self.FightControl = XUiNewRoomFightControl.New(self.FightControlGo) end self.FightControl:UpdateInfo(stageConfig.FightControlId , teamAbilities , self.Proxy:CheckStageForceConditionWithTeamEntityId(self.Team, self.StageId, false) , self.StageId , self.Team:GetEntityIds()) end function XUiBattleRoleRoom:GetClickPosition() return XUiHelper.GetScreenClickPosition(self.Transform, self.Camera) end function XUiBattleRoleRoom:GetCharacterLimitType() return XFubenConfigs.GetStageCharacterLimitType(self.StageId) end return XUiBattleRoleRoom