PGRData/Script/matrix/xui/xuidoomsday/XUiDoomsdayExplore.lua

543 lines
19 KiB
Lua
Raw Normal View History

local XUiGridDoomsdayPlace = require("XUi/XUiDoomsday/XUiGridDoomsdayPlace")
local XUiGridDoomsdayResource = require("XUi/XUiDoomsday/XUiGridDoomsdayResource")
local XUiGridDoomsdayInhabitantAttr = require("XUi/XUiDoomsday/XUiGridDoomsdayInhabitantAttr")
local XUiDoomsdayDragZoomProxy = require("XUi/XUiDoomsday/XUiDoomsdayDragZoomProxy")
local MAX_PLACE_COUNT = 42 --最大探索地点数量
local EXPLORE_TEAM_NUM = 2 --探索小队数量
local ANIM_TIME = 0.5 --镜头移动动画时间
2024-09-01 20:49:41 +00:00
local PATH_GENERATOR_TIME = 0.8 --新地点生成,路径动画时长
local CSVector2 = CS.UnityEngine.Vector2
local CSVector3 = CS.UnityEngine.Vector3
local CSQuaternion = CS.UnityEngine.Quaternion
2024-09-01 20:49:41 +00:00
local PATH_NAME = "Line" --路径物体名
local XUiDoomsdayExplore = XLuaUiManager.Register(XLuaUi, "UiDoomsdayExplore")
function XUiDoomsdayExplore:OnAwake()
2024-09-01 20:49:41 +00:00
self.BtnInhabitant = self.PanelInhabitant:GetComponent("XUiButton")
self:AutoAddListener()
2024-09-01 20:49:41 +00:00
self.GridDoomsdayStageCamp.gameObject:SetActiveEx(false)
self.GridDoomsdayStage.gameObject:SetActiveEx(false)
self.BtnMainUi.gameObject:SetActiveEx(false)
2024-09-01 20:49:41 +00:00
self.DragProxy = XUiDoomsdayDragZoomProxy.New(self.PanelDrag)
self.Effect = self.Transform:Find("SafeAreaContentPane/Effect")
self.Line = {}
end
function XUiDoomsdayExplore:OnStart(stageId, focusPlaceId)
self.StageId = stageId
self.StageData = XDataCenter.DoomsdayManager.GetStageData(stageId)
self.PlaceGrids = {}
self.TeamGrids = {}
self.FocusPlaceId = focusPlaceId or XDoomsdayConfigs.StageConfig:GetProperty(stageId, "FirstPlace")
2024-09-01 20:49:41 +00:00
local prefab = self.PanelStages:LoadPrefab(XDoomsdayConfigs.StageConfig:GetProperty(stageId, "PrefabPath"))
self.MapPrefab = {}
XTool.InitUiObjectByUi(self.MapPrefab, prefab)
self.Waiting2AddPlace = {}
self:InitView()
end
function XUiDoomsdayExplore:OnEnable()
if self.IsEnd then
return
end
if XDataCenter.DoomsdayManager.OnActivityEnd() then
self.IsEnd = true
return
end
self:UpdateView()
end
function XUiDoomsdayExplore:OnGetEvents()
return {
XEventId.EVENT_DOOMSDAY_ACTIVITY_END
}
end
function XUiDoomsdayExplore:OnNotify(evt, ...)
if self.IsEnd then
return
end
local args = {...}
if evt == XEventId.EVENT_DOOMSDAY_ACTIVITY_END then
if XDataCenter.DoomsdayManager.OnActivityEnd() then
self.IsEnd = true
return
end
end
end
function XUiDoomsdayExplore:AutoAddListener()
self:BindHelpBtn()
self:BindExitBtns()
self.BtnTask.CallBack = handler(self, self.OnClickBtnTarget)
self.BtnPosition.CallBack = handler(self, self.OnClickBtnPosition)
2024-09-01 20:49:41 +00:00
self.BtnInhabitant.CallBack = handler(self, self.OnClickBtnInhabitant)
for i = 1, EXPLORE_TEAM_NUM do
self["BtnTeam0" .. i].CallBack = function()
self:OnClickBtnTeam(i)
end
end
2024-09-01 20:49:41 +00:00
end
function XUiDoomsdayExplore:InitView()
local stageId = self.StageId
self.TxtTitle.text = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "Name")
local mainTargetId = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "MainTaskId")
self.BtnTask:SetName(XDoomsdayConfigs.TargetConfig:GetProperty(mainTargetId, "Desc"))
end
function XUiDoomsdayExplore:UpdateView()
local stageId = self.StageId
local stageData = self.StageData
2024-09-01 20:49:41 +00:00
self:BindViewModelPropertyToObj(
stageData,
function(curWeatherId)
local effectPath = XDoomsdayConfigs.WeatherConfig:GetProperty(curWeatherId, "EffectPath")
if not string.IsNilOrEmpty(effectPath) then
self.Effect.gameObject:LoadUiEffect(effectPath)
end
end,
"_CurWeatherId"
)
--剩余天数
self:BindViewModelPropertyToObj(
stageData,
2024-09-01 20:49:41 +00:00
function(day)
self.TxtTitleDate.text = CsXTextManagerGetText("DoomsdayFubenMainLeftDaySimple", day)
end,
2024-09-01 20:49:41 +00:00
"_Day"
)
--资源栏
self:RefreshTemplateGrids(
2024-09-01 20:49:41 +00:00
self.GridResource,
XDoomsdayConfigs.GetResourceIds(),
2024-09-01 20:49:41 +00:00
self.PanelResource,
function()
return XUiGridDoomsdayResource.New(stageId)
end,
"ResourceGrids"
)
--居民信息
self:BindViewModelPropertiesToObj(
stageData,
function(idleCount, count)
2024-09-01 20:49:41 +00:00
self.TxtInhabitantCount.text = string.format("%d/%d", idleCount, count)
end,
"_IdleInhabitantCount",
"_InhabitantCount"
)
--居民异常状态
self:BindViewModelPropertyToObj(
stageData,
function(unhealthyInhabitantInfoList)
2024-09-01 20:49:41 +00:00
local isEmpty = XTool.IsTableEmpty(unhealthyInhabitantInfoList)
self.GridAttrList.gameObject:SetActiveEx(not isEmpty)
--只显示不健康状态下的属性
self:RefreshTemplateGrids(
2024-09-01 20:49:41 +00:00
self.PanelAttr,
unhealthyInhabitantInfoList,
2024-09-01 20:49:41 +00:00
self.GridAttrList,
XUiGridDoomsdayInhabitantAttr,
"InhabitantAttrGrids"
)
end,
"_UnhealthyInhabitantInfoList"
)
--探索地点
self:BindViewModelPropertyToObj(
stageData,
function(unlockPlaceIds)
2024-09-01 20:49:41 +00:00
self:RefreshPlaceGrid(unlockPlaceIds)
end,
"_UnlockPlaceIds"
)
--探索地点附加随机事件
local placeEventDic = stageData:GetPlaceEventDic()
for placeId, event in pairs(placeEventDic) do
local grid = self.PlaceGrids[placeId]
if grid then
grid:SetEvent(event)
end
end
--探索小队状态
self:BindViewModelPropertiesToObj(
stageData,
function()
for teamId = 1, EXPLORE_TEAM_NUM do
local btn = self["BtnTeam0" .. teamId]
local unlock = stageData:CanCreateTeam(teamId)
local grid = self.TeamGrids[teamId]
if not grid then
grid = XTool.InitUiObjectByUi({}, btn)
self.TeamGrids[teamId] = grid
end
local teamExist = stageData:CheckTeamExist(teamId)
grid.PanelUnlock.gameObject:SetActiveEx(teamExist)
grid.PanelCreat.gameObject:SetActiveEx(unlock and not teamExist)
if teamExist then
local team = stageData:GetTeam(teamId)
self:BindViewModelPropertiesToObj(
team,
function(placeId, targetPlaceId, state)
--探索路径画线
if placeId ~= targetPlaceId then
self:DrawMoveLine(placeId, targetPlaceId,teamId)
end
grid.PanelStatuMove.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.MOVING)
grid.PanelStatuEvent.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.BUSY)
grid.PanelStatuStand.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.WAITING)
end,
"_PlaceId",
"_TargetPlaceId",
"_State"
)
end
self["BtnTeam0" .. teamId]:SetDisable(not unlock and not teamExist)
end
end,
"_UnlockTeamCount",
"_TeamCount"
)
self:UpdateFocusPlace()
end
2024-09-01 20:49:41 +00:00
function XUiDoomsdayExplore:RefreshPlaceGrid(unlockPlaceIds)
for _, placeId in pairs(unlockPlaceIds) do
local isCamp = XDoomsdayConfigs.CheckPlaceIsCamp(self.StageId, placeId)
local grid = self.PlaceGrids[placeId]
if not grid then
local pos = XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "Pos")
local go = isCamp and self.GridDoomsdayStageCamp or self.GridDoomsdayStage
local parent = self.MapPrefab["Stage" .. pos]
grid =
XUiGridDoomsdayPlace.New(XUiHelper.Instantiate(go, parent), self.StageId, self,
handler(self, self.OnClickPlace))
self.PlaceGrids[placeId] = grid
local prePlaceId = XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "PrePlaceId")
if XTool.IsNumberValid(prePlaceId) then --拥有前置节点
local prePos = XDoomsdayConfigs.PlaceConfig:GetProperty(prePlaceId, "Pos")
local preParent = self.MapPrefab["Stage" .. prePos]
local posStart, posEnd = preParent.anchoredPosition, parent.anchoredPosition
posStart = CSVector2(posStart.x, posStart.y)
posEnd = CSVector2(posEnd.x, posEnd.y)
local _, width, angle =
XUiHelper.CalculateLineWithTwoPosition(
posStart,
posEnd,
posStart.y > posEnd.y and CSVector3(0, 0, -1) or CSVector3(0, 0, 1)
)
local line = CS.UnityEngine.GameObject.Instantiate(self.PathLine, preParent, false)
line.localScale = CSVector3.one
line.localRotation = angle
line.localPosition = CSVector3.zero
line.gameObject:SetActiveEx(true)
line.gameObject.name = PATH_NAME
local deltaY = self.PathLine.sizeDelta.y
line.sizeDelta = CSVector2.zero
if self.IsAnimation then
table.insert(self.Waiting2AddPlace, {grid, placeId, width, line, deltaY})
else
line.sizeDelta = CSVector2(width, deltaY)
grid.GameObject:SetActiveEx(true)
end
local uiLine = parent.transform:Find(PATH_NAME)
if uiLine then
uiLine.gameObject:SetActiveEx(false)
uiLine.gameObject.name = "UiLine"
end
end
if isCamp then --营地,没有前置
local line = parent.transform:Find(PATH_NAME)
if line then
line.gameObject:SetActiveEx(false)
line.gameObject.name = "UiLine"
end
grid.GameObject:SetActiveEx(true)
end
end
grid:Refresh(placeId, isCamp)
end
--首次进入界面不播放动画
self.IsAnimation = true
self:AddPlaceWithAnim()
end
function XUiDoomsdayExplore:AddPlaceWithAnim()
if XTool.IsTableEmpty(self.Waiting2AddPlace) then
return
end
local index = 1
RunAsyn(function()
while true do
--避免函数被多次执行
if (XLuaUiManager.IsUiShow("UidoomsdayEvent")) or self.IsDrawPath then
asynWaitSecond(0.02) --避免界面打开后不关while true 浪费性能,事件界面可能打开多次
goto continue
end
XLuaUiManager.SetMask(true)
local item = self.Waiting2AddPlace[index]
if not item then
self.Waiting2AddPlace = {}
XLuaUiManager.SetMask(false)
break
end
self.IsDrawPath = true
local grid, placeId, width, line, deltaY = table.unpack(item)
local asyncAnim = asynTask(grid.PlayEnable, grid)
XUiHelper.Tween(PATH_GENERATOR_TIME, function(dt)
local tmpWidth = width * dt
line.sizeDelta = CSVector2(tmpWidth, deltaY)
end, function()
self:FocusStage(grid, nil, nil, ANIM_TIME)
end)
XUiManager.TipMsg(XUiHelper.GetText("DoomsdayPlaceUnLockTips", XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "Name")))
asynWaitSecond(2) -- 等待提示关闭
grid.GameObject:SetActiveEx(true)
if grid.GameObject.activeInHierarchy
and self.GameObject.activeInHierarchy then
asyncAnim()
end
index = index + 1
self.IsDrawPath = false
XLuaUiManager.SetMask(false)
::continue::
end
end)
end
--探索路径画线
2024-09-01 20:49:41 +00:00
function XUiDoomsdayExplore:DrawMoveLine(placeId, targetPlaceId, teamId)
if not XTool.IsNumberValid(placeId) or not XTool.IsNumberValid(targetPlaceId) then
return
end
local gridA = self.PlaceGrids[placeId]
if not gridA then
XLog.Error(string.format("DrawMoveLine error:当前地点未解锁或不在配置中 placeId:%s", placeId))
return
end
local gridB = self.PlaceGrids[targetPlaceId]
if not gridB then
XLog.Error(string.format("DrawMoveLine error:目标地点未解锁或不在配置中 targetPlaceId:%s", targetPlaceId))
return
end
2024-09-01 20:49:41 +00:00
-----@type UnityEngine.Vector2
--local positionA, positionB =
-- self.PlaceGrids[placeId].Transform.parent.anchoredPosition,
-- self.PlaceGrids[targetPlaceId].Transform.parent.anchoredPosition
--positionA = Vector2(positionA.x, positionA.y)
--positionB = Vector2(positionB.x, positionB.y)
--local position, width, angle =
-- XUiHelper.CalculateLineWithTwoPosition(
-- positionB,
-- positionA,
-- positionA.y > positionB.y and CSVector3(0, 0, 1) or CSVector3(0, 0, -1)
--)
local transform = self.Line[teamId]
if not transform then
---@type UnityEngine.RectTransform
2024-09-01 20:49:41 +00:00
--transform = CS.UnityEngine.GameObject.Instantiate(self:FindTransform("Line25_28").gameObject).transform
local lineParent = CS.UnityEngine.GameObject.Instantiate(self.LinePrefab.gameObject, self.PanelStages.transform, false).transform
lineParent.gameObject:SetActiveEx(true)
local linEffect = lineParent.gameObject:LoadUiEffect(XDoomsdayConfigs.GetExplorePathFx())
transform = {}
XTool.InitUiObjectByUi(transform, linEffect)
self.Line[teamId] = transform
end
2024-09-01 20:49:41 +00:00
--transform.parent = self.PanelStages.transform
--transform.localPosition = CSVector3(position.x, position.y, 0)
--transform.localScale = CSVector3.one
--transform.localRotation = angle
--transform.sizeDelta = CSVector2(width, transform.sizeDelta.y)
--transform.gameObject:SetActiveEx(true)
transform.Start.position = self.PlaceGrids[placeId].Transform.position
transform.Target.position = self.PlaceGrids[targetPlaceId].Transform.position
end
function XUiDoomsdayExplore:OnClickPlace(placeId)
2024-09-01 20:49:41 +00:00
--if XDoomsdayConfigs.CheckPlaceIsCamp(self.StageId, placeId) then
-- self:Close()
-- return
--end
for inId, grid in pairs(self.PlaceGrids) do
local isShow = placeId == inId
grid:SetSelect(isShow)
grid.Transform.parent.gameObject:SetActiveEx(isShow)
if isShow then
self:FocusStage(grid, 0.382, 0.5, 0.5)
end
end
2024-09-01 20:49:41 +00:00
self:SetSelectLineState(placeId, false)
for _, obj in pairs(self.Line) do
2024-09-01 20:49:41 +00:00
obj.GameObject:SetActiveEx(false)
end
self.PanelHide.gameObject:SetActiveEx(false)
XLuaUiManager.Open("UiDoomsdayExploreTcanchuang", self.StageId, placeId, handler(self, self.OnStageDetailClose))
end
2024-09-01 20:49:41 +00:00
function XUiDoomsdayExplore:OnStageDetailClose(placeId)
self.PanelHide.gameObject:SetActiveEx(true)
for inId, grid in pairs(self.PlaceGrids) do
grid:SetSelect(false)
grid.Transform.parent.gameObject:SetActiveEx(true)
if self.AnimOffset then
self.PanelStages:DOLocalMove(self.PanelStages.localPosition - self.AnimOffset, 0.5)
self.AnimOffset = nil
end
end
2024-09-01 20:49:41 +00:00
self:SetSelectLineState(placeId, true)
for _, obj in pairs(self.Line) do
2024-09-01 20:49:41 +00:00
obj.GameObject:SetActiveEx(true)
end
end
function XUiDoomsdayExplore:SetSelectLineState(placeId, state)
local selectGrid = self.PlaceGrids[placeId]
if selectGrid then
local parent = selectGrid.Transform.parent
local count = parent.transform.childCount
for i = 0, count - 1 do
local child = parent:GetChild(i)
if child and child.name == PATH_NAME then
child.gameObject:SetActiveEx(state)
end
end
end
end
function XUiDoomsdayExplore:OnClickBtnTeam(teamIndex)
local stageId = self.StageId
local stageData = self.StageData
2024-09-01 20:49:41 +00:00
if self.StageData:IsFinishEndAndTips() then
return
end
local teamExist = stageData:CheckTeamExist(teamIndex)
if not teamExist and not stageData:CanCreateTeam(teamIndex) then
XUiManager.TipText("DoomsdayTeamLock")
return
end
local event = stageData:GetTeamEvent(teamIndex)
if event then
XDataCenter.DoomsdayManager.EnterEventUi(stageId, event)
else
XLuaUiManager.Open("UiDoomsdayTeamTip", stageId, teamIndex)
end
end
function XUiDoomsdayExplore:OnClickBtnPosition()
local stageId = self.StageId
local stageData = self.StageData
2024-09-01 20:49:41 +00:00
if self.StageData:IsFinishEndAndTips() then
return
end
local findPlaceId
2024-09-01 20:49:41 +00:00
local teamList = stageData:GetAlreadySetUpTeamList()
local teamMember = #teamList
for _, team in ipairs(teamList) do
local placeId = team:GetProperty("_PlaceId")
if teamMember > 1 and placeId ~= self.FocusPlaceId then
findPlaceId = placeId
end
end
2024-09-01 20:49:41 +00:00
if not findPlaceId and teamMember > 0 then
local team = teamList[1]
local placeId = team:GetProperty("_PlaceId")
findPlaceId = placeId
end
if findPlaceId then
self.FocusPlaceId = findPlaceId
self:UpdateFocusPlace()
end
local eventPlaceId = findPlaceId or self.FocusPlaceId
local event = stageData:GetPlaceEvent(eventPlaceId)
if event then
XDataCenter.DoomsdayManager.EnterEventUi(stageId, event)
end
end
function XUiDoomsdayExplore:UpdateFocusPlace()
local grid = self.PlaceGrids[self.FocusPlaceId]
if not grid then
return
end
grid.GameObject.name = "Focus"
self:FocusStage(grid, nil, nil, ANIM_TIME)
end
function XUiDoomsdayExplore:OnClickBtnTarget()
2024-09-01 20:49:41 +00:00
if self.StageData:IsFinishEndAndTips() then
return
end
XLuaUiManager.Open("UiDoomsdayFubenTask", self.StageId)
end
2024-09-01 20:49:41 +00:00
function XUiDoomsdayExplore:OnClickBtnInhabitant()
XLuaUiManager.Open("UiDoomsdayPeople", self.StageId)
end
function XUiDoomsdayExplore:FocusStage(grid, widthOffset, heightOffset, duration, easeType)
widthOffset = widthOffset or 0.5
heightOffset = heightOffset or 0.5
duration = duration or 0
easeType = easeType or CS.DG.Tweening.Ease.Linear
local stageObj = grid.Transform
local midScreenPos =
CS.UnityEngine.Vector2(CS.UnityEngine.Screen.width * widthOffset, CS.UnityEngine.Screen.height * heightOffset)
local _, midPos =
CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(
self.PanelStages,
midScreenPos,
CS.UnityEngine.Camera.main
)
local offset = CSVector3(midPos.x, midPos.y, 0) - stageObj.parent.localPosition
2024-09-01 20:49:41 +00:00
-- 避免缩放影响
offset.x = offset.x * self.PanelStages.localScale.x
offset.y = offset.y * self.PanelStages.localScale.y
self.AnimOffset = offset
self.PanelStages:DOLocalMove(self.PanelStages.localPosition + offset, duration)
end
return XUiDoomsdayExplore