PGRData/Script/matrix/xui/xuimoewar/sceneanimation/XUiMoeWarAnimation.lua

322 lines
No EOL
10 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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和23条跑道时跑道下标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