PGRData/Script/matrix/xui/xuigoldenminer/game/system/XGoldenMinerSystemTimeLineAnim.lua

133 lines
4.2 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
---@class XGoldenMinerSystemTimeLineAnim
local XGoldenMinerSystemTimeLineAnim = XClass(nil, "XGoldenMinerSystemTimeLineAnim")
---@param game XGoldenMinerGame
function XGoldenMinerSystemTimeLineAnim:Update(game, time)
for _, entity in pairs(game.HookEntityList) do
self:UpdateAnim(entity, time)
end
for _, entity in pairs(game.StoneEntityList) do
self:UpdateAnim(entity, time)
end
end
function XGoldenMinerSystemTimeLineAnim:UpdateAnim(entity, time)
---@type XGoldenMinerComponentTimeLineAnim
local anim = entity.Anim
if not anim then
return
end
if self:CheckBePlayIsNone(anim) and self:CheckCurPlayIsNone(anim) then
return
end
-- 动画播放
if not self:CheckCurPlayIsNone(anim) then
local curPlayableDirector = self:GetAnimObj(anim, anim.CurAnim)
anim.CurAnimDuration = anim.CurAnimDuration + time
if anim.CurAnimDuration >= curPlayableDirector.playableAsset.duration then
if anim.FinishCallBack then anim.FinishCallBack() end
self:ResetCurPlay(anim)
end
end
if self:CheckBePlayIsNone(anim) then
return
end
local bePlayableDirector = self:GetAnimObj(anim, anim.BePlayAnim)
if not bePlayableDirector then
if anim.BeFinishCallBack then
anim.BeFinishCallBack()
end
self:ResetBePlay(anim)
self:ResetCurPlay(anim)
return
end
if self:CheckCurPlayIsNone(anim) then
anim.CurAnim = anim.BePlayAnim
anim.FinishCallBack = anim.BeFinishCallBack
self:_PlayAnim(bePlayableDirector)
else -- 动画打断
local curPlayableDirector = self:GetAnimObj(anim, anim.CurAnim)
curPlayableDirector:Evaluate()
curPlayableDirector:Stop()
if not anim.IsBreakCurPlay and anim.FinishCallBack then
anim.FinishCallBack()
end
anim.CurAnim = anim.BePlayAnim
anim.FinishCallBack = anim.BeFinishCallBack
self:_PlayAnim(bePlayableDirector)
end
self:ResetBePlay(anim)
end
--region Anim
function XGoldenMinerSystemTimeLineAnim:PlayAnim(entity, animName, finishCallBack, isBreak)
---@type XGoldenMinerComponentTimeLineAnim
local anim = entity.Anim
if not anim then
if finishCallBack then
finishCallBack()
end
return
end
anim.BePlayAnim = animName
anim.BeFinishCallBack = finishCallBack
anim.IsBreakCurPlay = isBreak
end
---@param anim XGoldenMinerComponentTimeLineAnim
function XGoldenMinerSystemTimeLineAnim:ResetBePlay(anim)
anim.BePlayAnim = XGoldenMinerConfigs.GAME_ANIM.NONE
anim.BeFinishCallBack = false
end
---@param anim XGoldenMinerComponentTimeLineAnim
function XGoldenMinerSystemTimeLineAnim:ResetCurPlay(anim)
anim.CurAnimDuration = 0
anim.CurAnim = XGoldenMinerConfigs.GAME_ANIM.NONE
anim.FinishCallBack = false
end
---@param anim XGoldenMinerComponentTimeLineAnim
function XGoldenMinerSystemTimeLineAnim:CheckCurPlayIsNone(anim)
return anim.CurAnim == XGoldenMinerConfigs.GAME_ANIM.NONE
end
---@param anim XGoldenMinerComponentTimeLineAnim
function XGoldenMinerSystemTimeLineAnim:CheckBePlayIsNone(anim)
return anim.BePlayAnim == XGoldenMinerConfigs.GAME_ANIM.NONE
end
---@param playableDirector UnityEngine.Playables.PlayableDirector
---@param directorWrapMode number UnityEngine.Playables.DirectorWrapMode
function XGoldenMinerSystemTimeLineAnim:_PlayAnim(playableDirector, directorWrapMode)
if not playableDirector then
return
end
if not directorWrapMode then
directorWrapMode = CS.UnityEngine.Playables.DirectorWrapMode.Hold
end
if playableDirector.extrapolationMode ~= directorWrapMode then
playableDirector.extrapolationMode = directorWrapMode
end
playableDirector:Stop()
playableDirector:Evaluate()
playableDirector:Play()
end
---@param anim XGoldenMinerComponentTimeLineAnim
---@return UnityEngine.Playables.PlayableDirector
function XGoldenMinerSystemTimeLineAnim:GetAnimObj(anim, animName)
if not anim.AnimRoot then
return false
end
return XUiHelper.TryGetComponent(anim.AnimRoot, animName, "PlayableDirector")
end
--endregion
return XGoldenMinerSystemTimeLineAnim