307 lines
10 KiB
Lua
307 lines
10 KiB
Lua
|
local XUiGridAreaWarBlock = require("XUi/XUiAreaWar/XUiGridAreaWarBlock")
|
|||
|
|
|||
|
local pairs = pairs
|
|||
|
local tableInsert = table.insert
|
|||
|
local stringFormat = string.format
|
|||
|
local MathfLerp = CS.UnityEngine.Mathf.Lerp
|
|||
|
|
|||
|
local BLOCK_GRID_HEIGHT_LOW = CS.XGame.ClientConfig:GetFloat("AreaWarBlock3DGridHeightMin") --场景中区块对应的3D格子最小高度
|
|||
|
local BLOCK_GRID_HEIGHT_HIGH = CS.XGame.ClientConfig:GetFloat("AreaWarBlock3DGridHeightMax") --场景中区块对应的3D格子最大高度
|
|||
|
local BLOCK_GRID_ANIM_TIME = CS.XGame.ClientConfig:GetFloat("AreaWarBlock3DGridAnimTime") --场景中区块对应的3D格子动画时间(s)
|
|||
|
|
|||
|
--区块列表3D的UI
|
|||
|
local XUiPanelAreaWarMainBlockList3D = XClass(nil, "XUiPanelAreaWarMainBlockList3D")
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:Ctor(ui, grids3D, cameras, clickBlockCb)
|
|||
|
self.GameObject = ui.gameObject
|
|||
|
self.Transform = ui.transform
|
|||
|
self.Grids3D = grids3D
|
|||
|
self.NearCameras = cameras.StageDetail
|
|||
|
self.FarCameras = cameras.Normal
|
|||
|
self.ClickBlockCb = clickBlockCb
|
|||
|
XTool.InitUiObject(self)
|
|||
|
self.BlockGrids = {}
|
|||
|
self.DelayShowLines = {}
|
|||
|
self.PanelLine = self.Transform:FindTransform("PanelLine")
|
|||
|
|
|||
|
--还原上次相机跟随点位置
|
|||
|
local pos = XDataCenter.AreaWarManager.GetLastCameraFollowPointPos()
|
|||
|
if pos then
|
|||
|
self.CameraFollowPoint.transform.localPosition = pos
|
|||
|
else
|
|||
|
local blockIds = XAreaWarConfigs.GetAllBlockIds()
|
|||
|
self.CameraFollowPoint.transform.localPosition = self:GetGridParent(blockIds[1]).transform.localPosition
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:OnDispose()
|
|||
|
XDataCenter.AreaWarManager.SaveLastCameraFollowPointPos(self.CameraFollowPoint.transform.localPosition)
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:Refresh()
|
|||
|
local blockIds = XAreaWarConfigs.GetAllBlockIds()
|
|||
|
for _, blockId in pairs(blockIds) do
|
|||
|
--不可见区块不做更新
|
|||
|
--新解锁的3D格子未看见过升起动画的,不做更新,延迟到动画过程更新
|
|||
|
local checkDic = XDataCenter.AreaWarManager.GetNewUnlockBlockIdDic()
|
|||
|
if not XDataCenter.AreaWarManager.IsBlockVisible(blockId) or checkDic[blockId] then
|
|||
|
self:ResetGridHeight(blockId) --初始化3D格子的高度
|
|||
|
goto CONTINUE
|
|||
|
end
|
|||
|
|
|||
|
self:UpdateBlock(blockId)
|
|||
|
|
|||
|
::CONTINUE::
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:UpdateBlock(blockId)
|
|||
|
local parent = self:GetGridParent(blockId)
|
|||
|
if not parent then
|
|||
|
return
|
|||
|
end
|
|||
|
parent.gameObject:SetActiveEx(true)
|
|||
|
|
|||
|
--区块信息
|
|||
|
local grid = self.BlockGrids[blockId]
|
|||
|
if not grid then
|
|||
|
local prefabPath = XAreaWarConfigs.GetBlockShowTypePrefab(blockId)
|
|||
|
local go = parent:LoadPrefab(prefabPath)
|
|||
|
local clickCb = handler(self, self.OnClickBlock)
|
|||
|
grid = XUiGridAreaWarBlock.New(go, clickCb)
|
|||
|
self.BlockGrids[blockId] = grid
|
|||
|
end
|
|||
|
grid:Refresh(blockId)
|
|||
|
grid.GameObject:SetActiveEx(true)
|
|||
|
|
|||
|
--当前区块可显示,寻找前置区块中已净化的,尝试连线
|
|||
|
local checkDic = XDataCenter.AreaWarManager.GetNewUnlockBlockIdDic()
|
|||
|
local alternativeList = XAreaWarConfigs.GetBlockPreBlockIdsAlternativeList(blockId)
|
|||
|
for _, preBlockIds in pairs(alternativeList) do
|
|||
|
local preBlockId = preBlockIds[1] --只显示并列表中第一个区块的线
|
|||
|
if XDataCenter.AreaWarManager.IsBlockClear(preBlockId) then
|
|||
|
if checkDic[preBlockId] then
|
|||
|
--新解锁区块3D格子的连线延迟到解锁动画播放完毕之后更新
|
|||
|
tableInsert(
|
|||
|
self.DelayShowLines,
|
|||
|
{
|
|||
|
PreBlockId = preBlockId,
|
|||
|
BlockId = blockId
|
|||
|
}
|
|||
|
)
|
|||
|
else
|
|||
|
self:TryShowLine(preBlockId, blockId)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--场景中区块对应的3D格子状态
|
|||
|
local grid3D = self:GetGrid3DTransform(blockId)
|
|||
|
if grid3D then
|
|||
|
grid3D.localPosition =
|
|||
|
Vector3(grid3D.transform.localPosition.x, BLOCK_GRID_HEIGHT_HIGH, grid3D.transform.localPosition.z)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--Fucking Line!
|
|||
|
function XUiPanelAreaWarMainBlockList3D:TryShowLine(startBlockId, endBlockId)
|
|||
|
local lineName = stringFormat("Line%d_%d", startBlockId, endBlockId)
|
|||
|
local line = self[lineName]
|
|||
|
if not line then
|
|||
|
XLog.Error(
|
|||
|
stringFormat(
|
|||
|
"XUiPanelAreaWarMainBlockList3D:TryShowLine error: UiAreaWarMain3D上找不到对应的区块连线, 前置区块Id: %d, 当前区块Id: %d",
|
|||
|
startBlockId,
|
|||
|
endBlockId
|
|||
|
)
|
|||
|
)
|
|||
|
return
|
|||
|
end
|
|||
|
line.gameObject:SetActiveEx(true)
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:OnClickBlock(blockId)
|
|||
|
if not XDataCenter.AreaWarManager.IsBlockUnlock(blockId) then
|
|||
|
--优先提示区块解锁时间
|
|||
|
if XDataCenter.AreaWarManager.GetBlockUnlockLeftTime(blockId) > 0 then
|
|||
|
local openTime = XDataCenter.AreaWarManager.GetBlockUnlockTime(blockId)
|
|||
|
local tipStr =
|
|||
|
CsXTextManagerGetText(
|
|||
|
"AreaWarBlockUnlockTime",
|
|||
|
XTime.TimestampToGameDateTimeString(openTime, "MM/dd HH:mm")
|
|||
|
)
|
|||
|
XUiManager.TipMsg(tipStr)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--提示未解锁区块
|
|||
|
local needTip, tipStr = XDataCenter.AreaWarManager.GetBlockUnlockTips(blockId)
|
|||
|
XUiManager.TipMsg(tipStr)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
self.ClickBlockCb(blockId)
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:SetAsBlockChild(transform, blockId)
|
|||
|
local grid = self.BlockGrids[blockId]
|
|||
|
if not grid then
|
|||
|
XLog.Error("XUiPanelAreaWarMainBlockList3D:SetAsBlockChild error: grid not exist, blockId: ", blockId)
|
|||
|
return
|
|||
|
end
|
|||
|
transform:SetParent(grid.Transform.parent, false)
|
|||
|
end
|
|||
|
|
|||
|
--把关卡详情相机跟随目标设至到指定区块
|
|||
|
function XUiPanelAreaWarMainBlockList3D:SetDetailCameraFollowBlock(blockId)
|
|||
|
local grid = self.BlockGrids[blockId]
|
|||
|
if not grid then
|
|||
|
XLog.Error(
|
|||
|
"XUiPanelAreaWarMainBlockList3D:SetDetailCameraFollowBlock error: grid not exist, blockId: ",
|
|||
|
blockId
|
|||
|
)
|
|||
|
return
|
|||
|
end
|
|||
|
for _, camera in pairs(self.NearCameras) do
|
|||
|
camera.Follow = grid.Transform
|
|||
|
end
|
|||
|
|
|||
|
--隐藏其他区块
|
|||
|
for inBlockId, grid in pairs(self.BlockGrids) do
|
|||
|
grid.Transform.parent.gameObject:SetActiveEx(blockId == inBlockId)
|
|||
|
end
|
|||
|
self.PanelLine.gameObject:SetActiveEx(false)
|
|||
|
|
|||
|
--播放格子的近景动画
|
|||
|
grid:PlayNearAnim()
|
|||
|
end
|
|||
|
|
|||
|
--播放格子的远景动画
|
|||
|
function XUiPanelAreaWarMainBlockList3D:PlayGridFarAnim(blockId)
|
|||
|
local grid = self.BlockGrids[blockId]
|
|||
|
if not grid then
|
|||
|
XLog.Error("XUiPanelAreaWarMainBlockList3D:PlayGridFarAnim error: grid not exist, blockId: ", blockId)
|
|||
|
return
|
|||
|
end
|
|||
|
grid:PlayFarAnim()
|
|||
|
end
|
|||
|
|
|||
|
--把远景相机跟随目标设至到指定区块(用于控制相机拖拽)
|
|||
|
function XUiPanelAreaWarMainBlockList3D:SetNormalCameraFollowBlock(blockId)
|
|||
|
local grid = self.BlockGrids[blockId]
|
|||
|
if not grid then
|
|||
|
XLog.Error(
|
|||
|
"XUiPanelAreaWarMainBlockList3D:SetNormalCameraFollowBlock error: grid not exist, blockId: ",
|
|||
|
blockId
|
|||
|
)
|
|||
|
return
|
|||
|
end
|
|||
|
self.CameraFollowPoint.transform.localPosition = grid.Transform.parent.localPosition
|
|||
|
|
|||
|
for _, camera in pairs(self.FarCameras) do
|
|||
|
camera.Follow = self.CameraFollowPoint.transform
|
|||
|
end
|
|||
|
|
|||
|
--还原所有区块显示状态
|
|||
|
for _, grid in pairs(self.BlockGrids) do
|
|||
|
grid.Transform.parent.gameObject:SetActiveEx(true)
|
|||
|
end
|
|||
|
self.PanelLine.gameObject:SetActiveEx(true)
|
|||
|
end
|
|||
|
|
|||
|
--初始化3D格子的高度
|
|||
|
function XUiPanelAreaWarMainBlockList3D:ResetGridHeight(blockId)
|
|||
|
local grid3D = self:GetGrid3DTransform(blockId)
|
|||
|
if grid3D then
|
|||
|
grid3D.localPosition =
|
|||
|
Vector3(grid3D.transform.localPosition.x, BLOCK_GRID_HEIGHT_LOW, grid3D.transform.localPosition.z)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--3D格子升起动画
|
|||
|
function XUiPanelAreaWarMainBlockList3D:LetsLift(finishCb)
|
|||
|
--场景中所有可见格子
|
|||
|
local blockIds = XDataCenter.AreaWarManager.GetVisibleBlockIds()
|
|||
|
if XTool.IsTableEmpty(blockIds) then
|
|||
|
finishCb()
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local startY
|
|||
|
local targetY = BLOCK_GRID_HEIGHT_HIGH
|
|||
|
for _, blockId in pairs(blockIds) do
|
|||
|
local pos = self:GetGrid3DTransform(blockId).localPosition
|
|||
|
if pos.y ~= targetY then
|
|||
|
startY = pos.y
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--所有可见格子均已达到最高高度,无需播放动画
|
|||
|
if not startY then
|
|||
|
finishCb()
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local onRefreshFunc = function(time)
|
|||
|
local allAtPos = true
|
|||
|
local newY = MathfLerp(startY, targetY, time)
|
|||
|
for _, blockId in pairs(blockIds) do
|
|||
|
local tf = self:GetGrid3DTransform(blockId)
|
|||
|
if XTool.UObjIsNil(tf) then
|
|||
|
self:StopLiftAnim()
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
local pos = tf.localPosition
|
|||
|
if pos.y ~= targetY then
|
|||
|
allAtPos = false
|
|||
|
tf.localPosition = Vector3(pos.x, newY, pos.z)
|
|||
|
end
|
|||
|
end
|
|||
|
if allAtPos then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
self:StopLiftAnim()
|
|||
|
self.Timer = XUiHelper.Tween(BLOCK_GRID_ANIM_TIME, onRefreshFunc, finishCb)
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:StopLiftAnim()
|
|||
|
if self.Timer then
|
|||
|
XScheduleManager.UnSchedule(self.Timer)
|
|||
|
self.Timer = nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:GetGrid3DTransform(blockId)
|
|||
|
return self.Grids3D["Panel" .. blockId]
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:GetGridParent(blockId)
|
|||
|
local parent = self["Stage" .. blockId]
|
|||
|
if not parent then
|
|||
|
XLog.Error(
|
|||
|
"XUiPanelAreaWarMainBlockList3D:UpdateInformation error: 地图信息错误,UiAreaWarInformation上找不到对应的Stage节点,blockId:",
|
|||
|
blockId
|
|||
|
)
|
|||
|
end
|
|||
|
return parent
|
|||
|
end
|
|||
|
|
|||
|
function XUiPanelAreaWarMainBlockList3D:RefreshNewUnlockBlocks()
|
|||
|
local checkDic = XDataCenter.AreaWarManager.GetNewUnlockBlockIdDic()
|
|||
|
for blockId in pairs(checkDic) do
|
|||
|
self:UpdateBlock(blockId)
|
|||
|
end
|
|||
|
|
|||
|
for _, idPairs in pairs(self.DelayShowLines) do
|
|||
|
self:TryShowLine(idPairs.PreBlockId, idPairs.BlockId)
|
|||
|
end
|
|||
|
|
|||
|
XDataCenter.AreaWarManager.SetNewUnlockBlockIdDicCookie(checkDic)
|
|||
|
end
|
|||
|
|
|||
|
return XUiPanelAreaWarMainBlockList3D
|