local BaseObject = require "app/bf/unity/base_object" local CharacterSpineObject = class("CharacterSpineObject", BaseObject) local BF_CHARACTER_SPINE_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_CHARACTER_SPINE_HELPER local hash = GFunc.hash local CHILDMAP_METATABLE = { __index = function(t, k) if rawget(t, k) == nil then local v = rawget(t, hash(k)) if v then rawset(t, k, v) end return v end return rawget(t, k) end } function CharacterSpineObject:ctor() end function CharacterSpineObject:getCharacterSpineHelper() return self.characterSpineHelper end function CharacterSpineObject:initWithPrefab(assetPath, modelId, prefab) BaseObject.initWithPrefab(self, assetPath, prefab) self.modelId = modelId self.characterSpineHelper = self:getComponent(BF_CHARACTER_SPINE_HELPER) if self.characterSpineHelper == nil then self.characterSpineHelper = self:addComponent(BF_CHARACTER_SPINE_HELPER) end self.mainSpine = self.characterSpineHelper:GetSpineObject() self.objectIndex = -1 self:_genAllChildren() end function CharacterSpineObject:initWithCharacterHelper(characterSpineHelper, index, gameObject, name, admin) self.characterSpineHelper = characterSpineHelper self.objectIndex = index self.gameObject = gameObject self.name = name self.admin = admin end function CharacterSpineObject:refreshSkeletonDataAsset(dataAsset) local skeletonGraphic = self:getSkeletonGraphic() skeletonGraphic.skeletonDataAsset = dataAsset skeletonGraphic:Initialize(true) self.characterSpineHelper:Reload() end function CharacterSpineObject:_genAllChildren() local childMap = {} if self.characterSpineHelper then local childNum = self.characterSpineHelper:GetListCount() for i = 0, childNum do local gameObject = self.characterSpineHelper:GetGameObjectByIndex(i) local hashName = self.characterSpineHelper:GetHashNameByIndex(i) local child = CharacterSpineObject:create() child:initWithCharacterHelper(self.characterSpineHelper, i, gameObject, hashName, self) if childMap[hashName] == nil then childMap[hashName] = child end table.insert(self.childList, child) end end setmetatable(childMap, CHILDMAP_METATABLE) self.childMap = childMap end function CharacterSpineObject:getChildByName(name) return self.childMap[name] end function CharacterSpineObject:getMainSpine() return self.mainSpine end function CharacterSpineObject:getModelId() return self.modelId end function CharacterSpineObject:fastGetBonePosition(name) if self.characterSpineHelper then self.characterSpineHelper:CacheBonePosition(name) return self.characterSpineHelper.PositionX, self.characterSpineHelper.PositionY, self.characterSpineHelper.PositionZ end end function CharacterSpineObject:fastGetPosition() if self.characterSpineHelper then self.characterSpineHelper:CachePosition(self.objectIndex) return self.characterSpineHelper.PositionX, self.characterSpineHelper.PositionY, self.characterSpineHelper.PositionZ else local position = self:getTransform().position return position.x, position.y, position.z end end function CharacterSpineObject:setPosition(x, y, z) if self.characterSpineHelper then self.characterSpineHelper:SetPosition(self.objectIndex, x, y, z) else BaseObject.SetPosition(self, x, y, z) end end function CharacterSpineObject:setEulerAngles(x, y, z) if self.characterSpineHelper then self.characterSpineHelper:SetEulerAngles(self.objectIndex, x, y, z) else BaseObject.setEulerAngles(self, x, y, z) end end function CharacterSpineObject:setLocalEulerAngles(x, y, z) if self.characterSpineHelper then self.characterSpineHelper:SetLocalEulerAngles(self.objectIndex, x, y, z) else BaseObject.setLocalEulerAngles(self, x, y, z) end end function CharacterSpineObject:setLocalScale(x, y, z) if self.characterSpineHelper then self.characterSpineHelper:SetLocalScale(self.objectIndex, x, y, z) else BaseObject.setLocalScale(self, x, y, z) end end function CharacterSpineObject:setLocalScaleX(x) if self.characterSpineHelper then self.characterSpineHelper:SetLocalScaleX(self.objectIndex, x) else BaseObject.setLocalScaleX(self, x) end end function CharacterSpineObject:playAnimation(animName, loop, forceRefresh) if self.characterSpineHelper then self.characterSpineHelper:PlayAnimation(animName, loop, forceRefresh) end end -- 战斗里面粒子特效和spine特效混用,统一调用的stop接口,这里先放一个空方法 function CharacterSpineObject:stop() end function CharacterSpineObject:setTimeScale(timeScale) self.timeScale = timeScale if self.characterSpineHelper then if self.localTimeScale then self.characterSpineHelper:SetAnimationSpeed(self.timeScale*self.localTimeScale) else self.characterSpineHelper:SetAnimationSpeed(self.timeScale) end end end function CharacterSpineObject:setLocalTimeScale(localTimeScale) self.localTimeScale = localTimeScale self:setTimeScale(self.timeScale or 1) end function CharacterSpineObject:setLoop(isLoop) if self.characterSpineHelper then self.characterSpineHelper:SetLoop(isLoop) end end function CharacterSpineObject:getAnimationDuration(animationName) if self.characterSpineHelper then return self.characterSpineHelper:GetAnimationDuration(animationName) end return 0 end function CharacterSpineObject:addAnimationCompleteCallback(callback) if self._animationStateCompleteCallback then return end self._animationStateCompleteCallback = function(entry) callback(entry.Animation.Name) end local state = self:getAnimationState() state:Complete("+", self._animationStateCompleteCallback) end function CharacterSpineObject:removeAnimationCompleteCallback() if self._animationStateCompleteCallback then local state = self:getAnimationState() state:Complete("-", self._animationStateCompleteCallback) self._animationStateCompleteCallback = nil end end function CharacterSpineObject:getSkeletonGraphic() if self.skeletonGraphic == nil then self.skeletonGraphic = self.characterSpineHelper:GetSkeletonGraphic() end return self.skeletonGraphic end function CharacterSpineObject:getInstanceID() if self.characterSpineHelper then return self.characterSpineHelper:GetInstanceID(self.objectIndex) end return BaseObject.getInstanceID(self) end function CharacterSpineObject:setBattleScheduleId(id) self.battleScheduleId = id end function CharacterSpineObject:getBattleScheduleId() return self.battleScheduleId end function CharacterSpineObject:onDestroy() self:removeAnimationCompleteCallback() BaseObject.onDestroy(self) self.skeletonAnimation = nil self.animationState = nil end return CharacterSpineObject