322 lines
No EOL
10 KiB
Lua
322 lines
No EOL
10 KiB
Lua
local XMoeWarAnimationRole = require("XUi/XUiMoeWar/SceneAnimation/XMoeWarAnimationRole")
|
||
|
||
local Lerp = CS.UnityEngine.Mathf.Lerp
|
||
local mathFloor = math.floor
|
||
|
||
local MAX_RUNWAY_COUNT = 3 --跑道最大数量
|
||
local END_CAMERA_INDEX = 3--终场相机Index
|
||
local FOLLOW_ROLE_CAMERA_INDEXS = { 2, 4 }--跟随胜利角色的相机Index
|
||
local MowWarSceneAnimationFxGoalEffectPath = CS.XGame.ClientConfig:GetString("MowWarSceneAnimationFxGoalEffectPath")--终点特效路径
|
||
local MowWarSceneAnimationFxVictoryEffectPath = CS.XGame.ClientConfig:GetString("MowWarSceneAnimationFxVictoryEffectPath")--终点特效路径(胜利)
|
||
|
||
local XUiMoeWarAnimation = XLuaUiManager.Register(XLuaUi, "UiMoeWarAnimation")
|
||
|
||
function XUiMoeWarAnimation:OnAwake()
|
||
self:RegisterButtonEvent()
|
||
self.PanelStart.gameObject:SetActiveEx(false)
|
||
end
|
||
|
||
---@param closeCallback function 设置关闭回调时接管原有的关闭逻辑
|
||
---@param players 进入场景中的角色Id列表
|
||
---@param match XMoeWarMatch
|
||
function XUiMoeWarAnimation:OnStart(animGroupIds, winnerIndex, closeCallback, players, match)
|
||
self.GroupIds = animGroupIds
|
||
self.WinnerIndex = winnerIndex
|
||
self.CloseCallback = closeCallback
|
||
self.Players = players
|
||
self.Match = match
|
||
self:InitScene()
|
||
self:InitRoles()
|
||
self:PlayStartAnimation()
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnDisable()
|
||
self:DestroyTimer()
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnDestroy()
|
||
for _, role in pairs(self.Roles) do
|
||
role:Dispose()
|
||
end
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnGetEvents()
|
||
return {
|
||
XEventId.EVENT_MOE_WAR_ACTIVITY_END,
|
||
XEventId.EVENT_MOE_WAR_UPDATE,
|
||
}
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnNotify(event, ...)
|
||
local args = { ... }
|
||
if event == XEventId.EVENT_MOE_WAR_ACTIVITY_END then
|
||
self.CloseCallback = function()
|
||
XUiManager.TipText("MoeWarActivityOver")
|
||
XLuaUiManager.RunMain()
|
||
end
|
||
elseif event == XEventId.EVENT_MOE_WAR_UPDATE then
|
||
self.CloseCallback = function()
|
||
XLuaUiManager.RunMain()
|
||
XLuaUiManager.Open("UiMoeWarMain")
|
||
XUiManager.TipText("MoeWarMatchEnd")
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnClose()
|
||
if self.CloseCallback then
|
||
self.CloseCallback()
|
||
return
|
||
end
|
||
self:Close()
|
||
end
|
||
|
||
function XUiMoeWarAnimation:InitScene()
|
||
local scene = self.UiSceneInfo.Transform
|
||
local root = self.UiModelGo.transform
|
||
local roleNum = #self.GroupIds
|
||
|
||
--选手模型父节点
|
||
local roleRoot
|
||
local roleRoot2 = root:FindTransformWithSplit("Panel01")--两人
|
||
local roleRoot3 = root:FindTransformWithSplit("Panel02")--三人
|
||
if roleNum >= 3 then
|
||
roleRoot = roleRoot3
|
||
roleRoot2.gameObject:SetActiveEx(false)
|
||
roleRoot3.gameObject:SetActiveEx(true)
|
||
else
|
||
roleRoot = roleRoot2
|
||
roleRoot2.gameObject:SetActiveEx(true)
|
||
roleRoot3.gameObject:SetActiveEx(false)
|
||
end
|
||
self.RoleParents = {
|
||
roleRoot:FindTransform("PanelModelCase1"),
|
||
roleRoot:FindTransform("PanelModelCase2"),
|
||
roleRoot:FindTransform("PanelModelCase3"),
|
||
}
|
||
|
||
--跑道
|
||
local paodao2 = scene:FindTransformWithSplit("SceneRunway_01")--两人
|
||
local paodao3 = scene:FindTransformWithSplit("SceneRunway_01b")--三人
|
||
paodao2.gameObject:SetActiveEx(roleNum == 2)
|
||
paodao3.gameObject:SetActiveEx(roleNum >= 3)
|
||
|
||
--人气显示
|
||
for i = 1, MAX_RUNWAY_COUNT do
|
||
self["PanelVote" .. i].gameObject:SetActiveEx(roleNum >= i)
|
||
end
|
||
|
||
--终点线特效
|
||
self.GoalEffectRoot = scene:FindTransform("PanelEffectGoal")
|
||
self.GoalEffectRoot.gameObject:SetLayerRecursively(CS.UnityEngine.LayerMask.NameToLayer("UiNear"))
|
||
self.GoalEffectRoot:LoadPrefab(MowWarSceneAnimationFxGoalEffectPath, false)
|
||
|
||
--角色相机
|
||
self.CurRoleCamera = nil
|
||
self.CameraRoles = {
|
||
root:FindTransform("CameraRole1"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraRole2"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraRole3"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraRole4"):GetComponent("CinemachineVirtualCamera"),
|
||
}
|
||
|
||
--远景相机
|
||
self.CurFarCamera = nil
|
||
self.FarCameras = {
|
||
root:FindTransform("CameraFar1"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraFar2"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraFar3"):GetComponent("CinemachineVirtualCamera"),
|
||
root:FindTransform("CameraFar4"):GetComponent("CinemachineVirtualCamera"),
|
||
}
|
||
|
||
--当前跟随角色的虚拟相机Index
|
||
self.FollowRoleCameraIndex = FOLLOW_ROLE_CAMERA_INDEXS[1]
|
||
end
|
||
|
||
function XUiMoeWarAnimation:InitRoles()
|
||
self.Roles = {}
|
||
local roleNum = #self.GroupIds
|
||
|
||
for index, groupId in pairs(self.GroupIds) do
|
||
index = index % MAX_RUNWAY_COUNT > 0 and index % MAX_RUNWAY_COUNT or MAX_RUNWAY_COUNT
|
||
|
||
local parent = self.RoleParents[index]
|
||
if not parent then
|
||
XLog.Error("XUiMoeWarAnimation:InitRoles error: 找不到角色对应赛道, index: " .. index)
|
||
break
|
||
end
|
||
|
||
--2条跑道时跑道下标1和2,3条跑道时跑道下标3~5
|
||
local runwayIndex = roleNum >= MAX_RUNWAY_COUNT and index + 2 or index
|
||
|
||
local switchCameraCb = function(index)
|
||
if index ~= self.WinnerIndex then return end
|
||
self:SwitchFollowRoleCamera()
|
||
end
|
||
|
||
local endAnimCb = handler(self, self.PlayEndAnimation)
|
||
local goalAnimCb = handler(self, self.PlayGoalAnimation)
|
||
local role = XMoeWarAnimationRole.New({
|
||
Index = index,
|
||
GroupId = groupId,
|
||
Parent = parent,
|
||
UiName = self.Name,
|
||
Scene = self.UiSceneInfo.Transform,
|
||
SwitchCameraCb = switchCameraCb,
|
||
EndAnimCb = endAnimCb,
|
||
GoalAnimCb = goalAnimCb,
|
||
Ui = self["PanelVote" .. index],
|
||
PlayerId = self.Players[index],
|
||
RunwayIndex = runwayIndex,
|
||
Match = self.Match})
|
||
table.insert(self.Roles, role)
|
||
end
|
||
end
|
||
|
||
function XUiMoeWarAnimation:SwitchFollowRoleCamera()
|
||
local cameraIndex
|
||
|
||
for _, index in pairs(FOLLOW_ROLE_CAMERA_INDEXS) do
|
||
if index ~= self.FollowRoleCameraIndex then
|
||
cameraIndex = index
|
||
break
|
||
end
|
||
end
|
||
|
||
local role = self.Roles[self.WinnerIndex]
|
||
role:SetFollowCamera(self.CameraRoles[cameraIndex])
|
||
role:SetFollowCamera(self.FarCameras[cameraIndex])
|
||
|
||
for index, camera in pairs(self.CameraRoles) do
|
||
camera.gameObject:SetActiveEx(index == cameraIndex)
|
||
end
|
||
for index, camera in pairs(self.FarCameras) do
|
||
camera.gameObject:SetActiveEx(index == cameraIndex)
|
||
end
|
||
|
||
self.FollowRoleCameraIndex = cameraIndex
|
||
end
|
||
|
||
function XUiMoeWarAnimation:PlayCameraAnimationStart()
|
||
if XTool.UObjIsNil(self.GameObject) then return end
|
||
|
||
local cameraIndex = self.FollowRoleCameraIndex
|
||
|
||
for index, camera in pairs(self.CameraRoles) do
|
||
if index == cameraIndex then
|
||
self.CurRoleCamera = camera
|
||
camera.gameObject:SetActiveEx(true)
|
||
else
|
||
camera.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
for index, camera in pairs(self.FarCameras) do
|
||
if index == cameraIndex then
|
||
self.CurFarCamera = camera
|
||
camera.gameObject:SetActiveEx(true)
|
||
else
|
||
camera.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiMoeWarAnimation:PlayCameraAnimationEnd()
|
||
local cameraIndex = END_CAMERA_INDEX
|
||
|
||
for index, camera in pairs(self.CameraRoles) do
|
||
camera.gameObject:SetActiveEx(index == cameraIndex)
|
||
end
|
||
|
||
for index, camera in pairs(self.FarCameras) do
|
||
camera.gameObject:SetActiveEx(index == cameraIndex)
|
||
end
|
||
end
|
||
|
||
function XUiMoeWarAnimation:RegisterButtonEvent()
|
||
self.BtnMainUi.CallBack = function() XLuaUiManager.RunMain() end
|
||
self.BtnBack.CallBack = handler(self, self.OnClickBtnClose)
|
||
self.BtnSkip.CallBack = handler(self, self.OnClickBtnClose)
|
||
end
|
||
|
||
function XUiMoeWarAnimation:OnClickBtnClose()
|
||
self:OnClose()
|
||
end
|
||
|
||
function XUiMoeWarAnimation:DestroyTimer()
|
||
if self.Timer then
|
||
XScheduleManager.UnSchedule(self.Timer)
|
||
self.Timer = nil
|
||
end
|
||
end
|
||
|
||
--播放开场动画
|
||
function XUiMoeWarAnimation:PlayStartAnimation()
|
||
local asynPlayAnim = asynTask(self.PlayAnimationWithMask, self)
|
||
|
||
RunAsyn(function()
|
||
--等待角色准备动作播放完毕
|
||
asynWaitSecond(2)
|
||
|
||
--播放镜头动画
|
||
self:PlayCameraAnimationStart()
|
||
|
||
--等待镜头动画播放完毕
|
||
asynWaitSecond(1)
|
||
|
||
--播放UI动画
|
||
if XTool.UObjIsNil(self.PanelStart) then return end
|
||
self.PanelStart.gameObject:SetActiveEx(true)
|
||
asynPlayAnim("PanelStartEnable")
|
||
if XTool.UObjIsNil(self.PanelStart) then return end
|
||
self.PanelStart.gameObject:SetActiveEx(false)
|
||
|
||
--UI动画播放完毕之后播放赛跑动画
|
||
self:PlayRaceAnimation()
|
||
end)
|
||
end
|
||
|
||
--播放所有赛道动画
|
||
function XUiMoeWarAnimation:PlayRaceAnimation()
|
||
for index, role in pairs(self.Roles) do
|
||
--相机跟随胜利者
|
||
if index == self.WinnerIndex then
|
||
role:SetFollowCamera(self.CurRoleCamera)
|
||
role:SetFollowCamera(self.CurFarCamera)
|
||
end
|
||
|
||
role:Run()
|
||
end
|
||
end
|
||
|
||
--播放终场动画
|
||
function XUiMoeWarAnimation:PlayEndAnimation(totalTime)
|
||
|
||
RunAsyn(function()
|
||
--播放相机转场动画
|
||
self:PlayCameraAnimationEnd()
|
||
|
||
--等待相机转场动画播放完毕
|
||
asynWaitSecond(totalTime)
|
||
|
||
--打开结束动画UI
|
||
if XTool.UObjIsNil(self.GameObject) then return end
|
||
XLuaUiManager.Open("UiMoeWarAnimationTips")
|
||
|
||
--等待ui结束动画播到一半刚好遮挡住全屏时
|
||
asynWaitSecond(0.6)
|
||
|
||
--关闭本UI
|
||
if XTool.UObjIsNil(self.GameObject) then return end
|
||
self:OnClose()
|
||
end)
|
||
|
||
end
|
||
|
||
--播放冲线特效
|
||
function XUiMoeWarAnimation:PlayGoalAnimation()
|
||
if XTool.UObjIsNil(self.GoalEffectRoot) then return end
|
||
self.GoalEffectRoot:LoadPrefab(MowWarSceneAnimationFxVictoryEffectPath, false)
|
||
self.GoalEffectRoot.gameObject:SetActiveEx(false)
|
||
self.GoalEffectRoot.gameObject:SetActiveEx(true)
|
||
end |