Files
Endfield-Data/LuaScripts/UI/Panels/GachaChar/GachaCharTLHelper.lua
2025-12-02 20:37:18 +07:00

169 lines
3.6 KiB
Lua

GachaCharTLHelper = HL.Class('GachaCharTLHelper')
GachaCharTLHelper.m_directors = HL.Field(HL.Table)
GachaCharTLHelper.m_actorDirector = HL.Field(CS.UnityEngine.Playables.PlayableDirector)
GachaCharTLHelper.m_root = HL.Field(Transform)
GachaCharTLHelper.m_updateKey = HL.Field(HL.Number) << -1
GachaCharTLHelper.m_loopStartTime = HL.Field(HL.Number) << -1
GachaCharTLHelper.m_loopEndTime = HL.Field(HL.Number) << -1
GachaCharTLHelper.m_args = HL.Field(HL.Table)
GachaCharTLHelper.m_exCamera = HL.Field(Transform)
GachaCharTLHelper.GachaCharTLHelper = HL.Constructor(CS.UnityEngine.Transform, HL.Table) << function(self, root, args)
self.m_directors = {}
self.m_args = args
local mainDir = root:GetComponent("CutsceneRootComponent").director
mainDir.enabled = false
for k = 0, root.childCount - 1 do
local child = root:GetChild(k)
local succ, dir = child:TryGetComponent(typeof(CS.UnityEngine.Playables.PlayableDirector))
if succ and dir ~= mainDir then
table.insert(self.m_directors, dir)
if child.name == "Actor" then
self.m_actorDirector = dir
end
end
end
self.m_updateKey = LuaUpdate:Add("TailTick", function(deltaTime)
self:TailTick(deltaTime)
end)
local succ, timeInfo = CS.Beyond.Gameplay.Core.TimelineUtils.GetClipTimeInfo(self.m_actorDirector, "Loop Track", "LoopPlayableClip")
if succ then
self.m_loopStartTime = timeInfo.x
self.m_loopEndTime = timeInfo.y
else
logger.error("没找到LoopTrack", self.m_actorDirector.transform:PathFromRoot())
end
self.m_exCamera = root:Find("ExternalCamera")
for _, dir in ipairs(self.m_directors) do
dir:RebuildGraph()
end
end
GachaCharTLHelper.inLoopTrack = HL.Field(HL.Boolean) << false
GachaCharTLHelper.PlayFromStart = HL.Method() << function(self)
self.inLoopTrack = false
self:SetTime(0, true)
end
GachaCharTLHelper.SampleToBeginning = HL.Method() << function(self)
self.inLoopTrack = false
for _, dir in ipairs(self.m_directors) do
dir:Stop()
dir.time = 0
dir:Evaluate()
end
self:TailTick(0)
end
GachaCharTLHelper.GetTime = HL.Method().Return(HL.Number) << function(self)
return self.m_actorDirector.time
end
GachaCharTLHelper.SetTime = HL.Method(HL.Number, HL.Boolean) << function(self, time, play)
for _, dir in ipairs(self.m_directors) do
dir.time = time
if play then
dir:Evaluate()
dir:Play()
else
dir:Evaluate()
end
end
self:TailTick(0)
end
GachaCharTLHelper.OnDispose = HL.Method() << function(self)
self.m_updateKey = LuaUpdate:Remove(self.m_updateKey)
end
GachaCharTLHelper.JumpToLoopSection = HL.Method(HL.Opt(HL.Number)) << function(self, offset)
self:SetTime(self.m_loopStartTime + (offset or 0), true)
end
GachaCharTLHelper.TailTick = HL.Method(HL.Number) << function(self, deltaTime)
if not self.inLoopTrack then
if self.m_actorDirector.time >= self.m_loopStartTime then
self.inLoopTrack = true
logger.info("GachaCharTLHelper inLoopTrack = true")
if self.m_args.onLoopChanged then
self.m_args.onLoopChanged(true)
end
end
else
if self.m_actorDirector.time < self.m_loopStartTime then
self.inLoopTrack = false
logger.info("GachaCharTLHelper inLoopTrack = false")
if self.m_args.onLoopChanged then
self.m_args.onLoopChanged(false)
end
end
end
end
HL.Commit(GachaCharTLHelper)
return GachaCharTLHelper