Files
StellaSora_DataLua/lua/game/spine/spinemanager.lua
T
SL1900 fb98bcdc16 Hotfix - 1.13.0.126
EN: 1.13.0.126
CN: 1.13.0.126
JP: 1.13.0.130
KR: 1.13.0.132
2026-07-23 17:00:00 +09:00

214 lines
5.0 KiB
Lua

local SpineManager = {}
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResTypeAny = GameResourceLoader.ResType.Any
local typeof = typeof
local mapInstance = {}
local nNextId = 1
local LoadPrefab = function(sPath)
prefab = GameResourceLoader.LoadAsset(ResTypeAny, Settings.AB_ROOT_PATH .. sPath, typeof(Object))
if prefab == nil then
printError("[SpineManager] 加载预制体失败, path = " .. tostring(sPath))
return nil
end
return prefab
end
local GetSkeletonGraphic = function(go)
if go == nil then
return nil
end
local comp
local trSkeleton = go.transform:Find("Skeleton")
if trSkeleton ~= nil and trSkeleton:IsNull() == false then
comp = trSkeleton:GetComponent("SkeletonGraphic")
end
if comp == nil then
comp = go:GetComponent("SkeletonGraphic")
end
return comp
end
local GetInstance = function(id)
return mapInstance[id]
end
function SpineManager.Create(nId, trParent)
local sPath = "Actor2D_Spine/" .. nId .. "/" .. nId .. ".prefab"
local prefab = LoadPrefab(sPath)
if prefab == nil then
return nil
end
local go = instantiate(prefab, trParent)
if go == nil then
printError("[SpineManager] instantiate 失败, path = " .. tostring(sPath))
return nil
end
local skeleton = GetSkeletonGraphic(go)
if skeleton == nil then
printError("[SpineManager] 预制体上未找到 SkeletonGraphic, path = " .. tostring(sPath))
destroyImmediate(go)
return nil
end
local id = nNextId
nNextId = nNextId + 1
mapInstance[id] = {
go = go,
tr = go.transform,
skel = skeleton,
sPath = sPath,
bPaused = false,
fLastTimeScale = 1,
bBound = false
}
return id
end
function SpineManager.Bind(go)
if go == nil then
return nil
end
local skeleton = GetSkeletonGraphic(go)
if skeleton == nil then
printError("[SpineManager] Bind: 未找到 SkeletonGraphic")
return nil
end
local id = nNextId
nNextId = nNextId + 1
mapInstance[id] = {
go = go,
tr = go.transform,
skel = skeleton,
sPath = nil,
bPaused = false,
fLastTimeScale = 1,
bBound = true
}
return id
end
function SpineManager.Destroy(id)
local tb = mapInstance[id]
if tb == nil then
return
end
if tb.go ~= nil and tb.go:IsNull() == false then
destroyImmediate(tb.go)
end
mapInstance[id] = nil
end
function SpineManager.Unbind(id)
if id == nil then
return
end
mapInstance[id] = nil
end
function SpineManager.ClearAll()
for _, tb in pairs(mapInstance) do
if tb.bBound ~= true and tb.go ~= nil and tb.go:IsNull() == false then
destroyImmediate(tb.go)
end
end
mapInstance = {}
end
function SpineManager.PlayAnim(id, sAnimName, bLoop, nTrackIndex)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return
end
nTrackIndex = nTrackIndex or 0
NovaAPIHotfix.PlayAnim_Graphic(tb.skel, nTrackIndex, sAnimName, bLoop == true)
end
function SpineManager.AddAnim(id, sAnimName, bLoop, fDelay, nTrackIndex)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return
end
nTrackIndex = nTrackIndex or 0
fDelay = fDelay or 0
NovaAPIHotfix.AddAnim_Graphic(tb.skel, nTrackIndex, sAnimName, bLoop == true, fDelay)
end
function SpineManager.SetTimeScale(id, fScale)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return
end
if fScale == nil then
fScale = 1
end
NovaAPIHotfix.SetTimeScale_Graphic(tb.skel, fScale)
tb.fLastTimeScale = fScale
tb.bPaused = false
end
function SpineManager.GetTimeScale(id)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return 1
end
return NovaAPIHotfix.GetTimeScale_Graphic(tb.skel)
end
function SpineManager.Pause(id)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return
end
if tb.bPaused == true then
return
end
tb.fLastTimeScale = tb.skel.timeScale
NovaAPIHotfix.SetTimeScale_Graphic(tb.skel, 0)
tb.bPaused = true
end
function SpineManager.Resume(id)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return
end
if tb.bPaused ~= true then
return
end
local fScale = tb.fLastTimeScale
if fScale == nil or fScale <= 0 then
fScale = 1
end
NovaAPIHotfix.SetTimeScale_Graphic(tb.skel, fScale)
tb.bPaused = false
end
function SpineManager.IsPaused(id)
local tb = GetInstance(id)
if tb == nil then
return false
end
return tb.bPaused == true
end
function SpineManager.GetAnimDuration(id, sAnimName)
local tb = GetInstance(id)
if tb == nil or tb.skel == nil then
return 0
end
if sAnimName == nil or sAnimName == "" then
return 0
end
local Duration = NovaAPIHotfix.GetAnimDuration(tb.skel, sAnimName)
if Duration == 0 then
printError(string.format("[SpineManager] GetAnimDuration: 找不到动画 %s", tostring(sAnimName)))
end
return Duration
end
function SpineManager.GetGameObject(id)
local tb = mapInstance[id]
if tb == nil then
return nil
end
return tb.go
end
function SpineManager.GetTransform(id)
local tb = mapInstance[id]
if tb == nil then
return nil
end
return tb.tr
end
function SpineManager.GetSkeleton(id)
local tb = mapInstance[id]
if tb == nil then
return nil
end
return tb.skel
end
return SpineManager