最近在学DNF的课,然后打算把Spine动画弄到编辑器中运行。
一开始看了下Spine源码之后,大概明白只要在调用SkeletonAnimation的Update方法就能够更新骨骼和状态,源码如下:
public void Update (float deltaTime) {
if (!valid || state == null)
return;
wasUpdatedAfterInit = true;
if (updateMode < UpdateMode.OnlyAnimationStatus)
return;
UpdateAnimationStatus(deltaTime);
if (updateMode == UpdateMode.OnlyAnimationStatus)
return;
ApplyAnimation();
}
protected void UpdateAnimationStatus (float deltaTime) {
deltaTime *= timeScale;
skeleton.Update(deltaTime);
state.Update(deltaTime);
}
因而做法也就很简单了,只要计算deltaTime,然后传入到这个函数里即可
通过EditorApplication.timeSinceStartup来计算编辑器更新的deltaTime,并且作为参数传入的SkeletonAnimation的Update函数里,如下图:
public void OnUpdate(float deltaTime, Action focusFun = null)
{
if (ownerAnim!=null)
{
ownerAnim.Update(deltaTime);
}
}
不过运行后,发现动画没有正确播放,花了一两个小时,都没找到原因所在,查了ChatGpt也搜索不到关键原因。最后索性在Spine的官方社区中搜了一下,找到了解决办法(所以说学好英语很重要!逛社区很重要!提问很重要!不要钻牛角尖!)
链接: https://zh.esotericsoftware.com/forum/d/11084-play-an-animation-on-editor-mode/16
看了下这个老哥的源码,发现思路是差不多的,就只有一个地方,我是不知道的
看了一下API
大概明白就是在编辑器窗口中的修改,并没有实时作用到Scene中(不知道这个理解对不对)
还找了一个相关的看了下
https://blog.csdn.net/nixcry/article/details/120987224
看来也有不少人踩过这个坑,以后写编辑器就要注意下这一点了
最后加上这句话后,也顺利在编辑器状态下运行Spine了,很舒服~
后日谈
最后Spine的作者在高版本加入了这个功能,但是已经过去四五年了,乐