spine-unity整体结构
spine-unity
的功能由以下几个组件组成:
spine-csharp
spine-unity
... Unity.
spine-csharp
spine-csharp
是spine运行库
使用C#接口
的公共核心。
你可以在Spine编辑器
中看到这个公共核心包含的类型和数据结构的代码,其中包括Skeleton
, Bone
, Slot
, Skin
, Attachment
,Animation
它会将JSON(.json)
和二进制
(在Unity中显示为.skel.bytes
)的骨架数据反序列化然后写进SkeletonData
对象模型中。
它包含了基本的AnimationState
实现、Spine
的基础、以及直接可以使用的动画控制。所有的类都是在Spine命名空间下。
有状态stateful
vs 无状态 stateless
Spine
的核心类(定义在spine-csharp
中)主要分为stateful-instance
和 stateless-data
这两种:
类似Skeleton
、 Bone
、 Slot
、 AnimationState
这些类都是有状态的对象,对它们进行修改不会影响到其它实例。你可以翻转Skeleton
、复位Bone
、修改Slot
或者改变AnimationState
的时间轴,并且它只适用于单例。
类似SkeletonData
, Animation
, Attachment
, BoneData
, SlotData
这些类都是无状态的对象,设计初衷就是让他们可以被所有Skeleton实例
交叉访问(比如每个Spine GameObject
可以创建一个骨架)。通常,你不应该去改动这些无状态的对象。
- 如果想得到有状态的对象,你可以使用
Skeleton
。(比如:设置骨架的姿势或者替换一个槽的附件) - 如果想得到无状态的对象,你可以使用
SkeletonData
。(比如:想要获得一些信息,例如Animation
的持续性、Event
、或者Setup/Bind
姿势)
spine-unity
大部分的周期管理方法都依靠spine-csharp遵循的UnityEngine的生命周期和游戏循环。 但是它也包含主要的渲染代码(在.LateUpdate
中)将Spine骨架转化为可见网格。
spine-unity
也在编辑器和运行时管理spine-csharp
类的反序列化和实例化。
在编写脚本的时候,请注意:所有的spine-csharp都应该在Awake中实例化。这意味着不能随意控制脚本执行顺序,不然不能保证当Awake被调用时已经实例化骨架和动画状态。
你应该在Start
之后访问(或缓存).state
或.skeleton
引用
SkeletonAnimator
允许用户使用Mecanim动画控制器
控制动画。 SkeletonUtility
允许Spine.Bones
和UnityEngine.Transform
之间进行转换。 这可以让你控制UnityEngine.Transform
驱动Bone
,或者让GameObject
随着Bone
运动
控制动画
一般来说,Spine.AnimationState
管理时间轨道、更新骨架、队列、分层以及混合/交叉混合动画。
但是Spine.AnimationState
是一个C#类。要在Unity使用它,有一个包含MonoBehaviour
的Spine.AnimationState
对象叫做SkeletonAnimation
。你可以在SkeletonAnimation
里面找到一个叫做state
的成员变量,它是Spine.AnimationState
对象的引用。
SkeletonAnimation
既管理更新时间,也生成Mesh对象,因为它是SkeletonRenderer
的派生类。你可以把骨架数据资源实例化成Spine GameObject
然后挂到GameObject
上。你可以称SkeletonAnimation
为Spine
组件