c1_lua/lua/app/bf/unity/ui_spine_object.lua
2023-06-01 15:03:22 +08:00

279 lines
7.6 KiB
Lua

local BaseObject = require "app/bf/unity/base_object"
local UISpineObject = class("SpineObject", BaseObject)
local BF_UI_TOUCH_EVENT = GConst.TYPEOF_UNITY_CLASS.BF_UI_TOUCH_EVENT
local TYPE_OF_SPINE_ASSET = GConst.TYPEOF_UNITY_CLASS.SKELETON_DATA_ASSET
local SPINE_ASSET_PATH = "assets/arts/spines/ui/%s/%s_skeletondata.asset"
local CHARACTERS_SPINE_ASSET_PATH = "assets/arts/spines/characters/%s/%s_skeletondata.asset"
function UISpineObject:ctor()
end
function UISpineObject:initSkeletonDataAsset(dataAsset)
local skeletonGraphic = self:getSkeletonGraphic()
skeletonGraphic.skeletonDataAsset = dataAsset
skeletonGraphic:Initialize(false)
skeletonGraphic.raycastTarget = false
end
function UISpineObject:refreshAssets(dataAsset)
local skeletonGraphic = self:getSkeletonGraphic()
skeletonGraphic.skeletonDataAsset = dataAsset
skeletonGraphic:Initialize(true)
end
function UISpineObject:getSkeletonGraphic()
if not self.skeletonGraphic then
self.skeletonGraphic = self:getComponent(GConst.TYPEOF_UNITY_CLASS.SKELETON_GRAPHIC)
end
if not self.skeletonGraphic then
Logger.logFatal("UISpineObject missing component CS.Spine.Unity.SkeletonGraphic!")
end
return self.skeletonGraphic
end
function UISpineObject:getAnimationState(forceRefresh)
self:getSkeletonGraphic()
if (not self.animationState and self.skeletonGraphic) or forceRefresh then
self.animationState = self.skeletonGraphic.AnimationState
end
return self.animationState
end
function UISpineObject:playAnim(animName, loop, forceRefresh, forceGetSG)
self:getAnimationState(forceGetSG)
if self.animationState then
local trackEntry = self.animationState:SetAnimation(0, animName, loop)
if forceRefresh then
self.skeletonGraphic:Update(0)
end
return trackEntry
end
end
function UISpineObject:getAnimationKeyFrameTime(animName)
if not self.animationKeyFrameTime then
self.animationKeyFrameTime = {}
end
local timeList = self.animationKeyFrameTime[animName]
if not timeList then
timeList = {}
self.animationKeyFrameTime[animName] = timeList
if not self.uiSpineHelper then
self.uiSpineHelper = self:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_UI_SPINE_HELPER)
if self.uiSpineHelper == nil then
self.uiSpineHelper = self:addComponent(GConst.TYPEOF_UNITY_CLASS.BF_UI_SPINE_HELPER)
end
end
local list = self.uiSpineHelper:GetAnimationKeyFrameTime(animName)
local count = list.Count
if count > 0 then
for i = 1, count do
table.insert(timeList, list[i - 1])
end
end
end
return timeList
end
function UISpineObject:clearAnimationKeyFrameTime()
for aniName, _ in pairs(self.animationKeyFrameTime) do
self.animationKeyFrameTime[aniName] = nil
end
end
--未验证TODO
function UISpineObject:rePlayAnim(animName, loop, forceRefresh)
self:getAnimationState()
if self.animationState then
self.animationState:SetEmptyAnimation(0, 1)
local trackEntry = self.animationState:SetAnimation(0, animName, loop)
if forceRefresh then
self.skeletonGraphic:Update(0)
end
return trackEntry
end
end
function UISpineObject:playAnimComplete(animName, loop, forceRefresh, complete, forceGetSG)
local spineAnim = self:getAnimation(self:playAnim(animName, loop, forceRefresh, forceGetSG))
local duration = spineAnim.Duration
local sequence = self:createBindTweenSequence()
sequence:AppendInterval(duration)
sequence:OnComplete(complete)
return duration
end
function UISpineObject:findAnim(animName)
self:getAnimationState()
if self.animationState then
return self.animationState.Data.SkeletonData:FindAnimation(animName)
end
end
function UISpineObject:hasAnim(animName)
return nil ~= self:findAnim(animName)
end
function UISpineObject:getAnimation(trackEntry)
return trackEntry and trackEntry.Animation
end
function UISpineObject:getAnimSpeed()
if self.skeletonGraphic then
return self.skeletonGraphic.timeScale
end
end
function UISpineObject:setTimeScale(timeScale)
if self.skeletonGraphic then
self.skeletonGraphic.timeScale = timeScale
end
end
function UISpineObject:setIsFreeze(value)
if self.skeletonGraphic then
self.skeletonGraphic.freeze = value
end
end
function UISpineObject:setIsUnScaledTime(value)
if self.skeletonGraphic then
self.skeletonGraphic.unscaledTime = value
end
end
function UISpineObject:clearTrack()
if self.animationState then
self.animationState:ClearTrack(0)
end
end
function UISpineObject:addClickListener(func)
self._addTouchFlag = true
local eventListener = self:getComponent(BF_UI_TOUCH_EVENT)
if eventListener == nil then
eventListener = self:addComponent(BF_UI_TOUCH_EVENT)
end
self._touchEventCallback = func
eventListener:AddTouchEventListener(function(eventType, x, y)
self:_onClickEvent(eventType, x, y)
end)
end
function UISpineObject:_onClickEvent(eventType, x, y)
if self._touchEventCallback and eventType == GConst.TOUCH_EVENT.UP_INSIDE then
self._touchEventCallback(eventType, x, y)
end
end
function UISpineObject:setTouchEnable(enable)
local graphic = self:getSkeletonGraphic()
graphic.raycastTarget = enable
end
function UISpineObject:getWidth()
local graphic = self:getSkeletonGraphic()
return graphic.SkeletonData.Width
end
function UISpineObject:getHeight()
local graphic = self:getSkeletonGraphic()
return graphic.SkeletonData.Height
end
function UISpineObject:setGrey(isGrey)
local component = self:getSkeletonGraphic()
GFunc.setGrey(component, isGrey)
end
function UISpineObject:loadAssetAsync(assetName, callback, useCharacterPath)
local path
if useCharacterPath then
path = string.format(CHARACTERS_SPINE_ASSET_PATH, assetName, assetName)
else
path = string.format(SPINE_ASSET_PATH, assetName, assetName)
end
if self.curAssetPath == path and not self.loadingAsset then
return callback and callback()
end
self:onLoadAsset()
self.curAssetPath = path
self.loadingAsset = true
ResourceManager:loadOriginAssetAsync(path, TYPE_OF_SPINE_ASSET, function(spineAssetPath, spineAsset)
self.loadingAsset = false
if self:isDestroyed() then
ResourceManager:unload(spineAssetPath)
return
end
if self.curAssetPath ~= spineAssetPath then
ResourceManager:unload(spineAssetPath)
return
end
local skeletonGraphic = self:getSkeletonGraphic()
skeletonGraphic.skeletonDataAsset = spineAsset
skeletonGraphic:Initialize(true)
if callback then
callback()
end
end)
end
function UISpineObject:getIsLoadingAsset()
return self.loadingAsset
end
function UISpineObject:onLoadAsset()
if self.curAssetPath then
ResourceManager:unload(self.curAssetPath)
self.curAssetPath = nil
end
self:addUnloadCallback(function()
if self.curAssetPath then
ResourceManager:unload(self.curAssetPath)
self.curAssetPath = nil
end
end)
end
function UISpineObject:addAnimationCompleteCallback(callback)
if self._animationStateCompleteCallback then
return
end
self._animationStateCompleteCallback = function(entry)
callback(entry.Animation.Name)
end
local state = self:getAnimationState()
if state then
state:Complete("+", self._animationStateCompleteCallback)
end
end
function UISpineObject:removeAnimationCompleteCallback()
if self._animationStateCompleteCallback then
local state = self:getAnimationState()
if state then
state:Complete("-", self._animationStateCompleteCallback)
end
self._animationStateCompleteCallback = nil
end
end
function UISpineObject:setTimeScale(timeScale)
if self.skeletonGraphic then
self.skeletonGraphic.timeScale = timeScale
end
end
function UISpineObject:onDestroy()
self:removeAnimationCompleteCallback()
if self._addTouchFlag then
self._touchEventCallback = nil
end
BaseObject.onDestroy(self)
self.skeletonGraphic = nil
self.animationState = nil
end
return UISpineObject